
English: 
[MUSIC PLAYING]
DAVID J. MALAN: All right.
This is CS50 and this is
the start of week two.
And you'll recall that over
the past couple of weeks,
we've been building up.

Arabic: 
[MUSIC PLAYING]
ديفيد ج. مالان: حسنًا.
هذه هي دورة CS50 وهذه
بداية الأسبوع الثاني.
وسنتذكر أنه على
مدار الأسبوعين الماضيين،
كنا نقوم بمرحلة التأسيس.

English: 
First initially from Scratch, the
graphical programming language
that we then, just last week,
translated to the equivalent program NC.
And of course, there's
a lot more syntax now.
It's entirely text but the ideas,
recall, were fundamentally the same.
The catch is that computers
don't understand this.
They only understand what language?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: zeros
and ones or binary.
And so there's a requisite step in order
for us to get from this code to binary.
And what was that step or that
program or process called?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: Yeah, so compiling.
And of course, recall as
you've now experimented
with this past week that
to compile a program,
you can use clang for C, language.
And you can just say clang
and then the name of the file
that you want to compile.
And that outputs by default
a pretty oddly named program.
Just a dot out.
Which stands for assembler output.
More on that in just a moment.
But recall too that you can
override that default behavior.
And you can actually say,
Output instead a program
called, hello instead of just a dot out.
But you can go one step further,
and you actually use Make.
And Make it self is not a
compiler, it's a build utility.

Arabic: 
أولاً بدايةً من لغة سكراتش،
لغة البرمجة الرسومية
التي قمنا فيما بعد، تحديدًا الأسبوع الماضي،
بترجمتها إلى البرنامج المكافئ NC.
وبالطبع، يوجد الآن
بناء جملة على نحو أكبر بكثير.
إنه نص بالكامل لكن الأفكار،
كما نتذكر، في الأساس هي ذاتها.
والجانب السلبي هو
أن أجهزة الكمبيوتر لا تفهم هذا.
فما اللغة التي تفهمها فقط؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: أصفار
وواحدات أو النظام الثنائي.
وبالتالي هناك خطوة ضرورية لنا
للوصول من هذه التعليمة البرمجية إلى النظام الثنائي.
وما هو الاسم الذي كان يُطلق على
تلك الخطوة أو ذلك البرنامج أو الإجراء؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: أجل، إذن هو التحويل البرمجي.
وبالطبع، تذكرون بما
أنكم الآن قد خضتم التجربة
مع هذا الإجراء في الأسبوع الماضي
فإنه لإجراء التحويل البرمجي لبرنامج،
يمكنكم استخدام أداة التحويل البرمجي clang الخاصة بلغة C.
يمكنكم فقط قول clang
ثم اسم الملف
الذي تريدون تحويله برمجيًا.
وتلك المخرجات بشكلٍ افتراضي
تسمى على نحو غريب جدًا باسم برنامج.
Just a dot out.
والتي تشير إلى مُخرَج برنامج التجميع.
علاوةً على ذلك أنه يتم في الحال.
لكن تذكروا أيضًا أنكم تستطيعون
تجاوز هذا السلوك الافتراضي.
ويمكنكم في الواقع أن تقولوا،
Output "مخرَج" بدلاً من program "برنامج"
ويُسمى، hello بدلاً من just a dot out.
لكن يمكنكم القيام بخطوة أخرى إضافية،
ويمكنكم بالفعل استخدام أداة Make.
وأداة Make في حد ذاتها ليست
أداة تحويل برمجي، بل إنها أداة بناء مساعدة.

Arabic: 
لكن بمصطلح غير المتخصصين،
ما الذي تفعله لنا؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: تقوم بتحويله برمجيًا.
وهي في الأساس تكتشف
كل وسيطات سطر الأوامر تلك
ذات المظهر التشفيري.
مثل -o "شرطة o" شيء ما، وما إلى ذلك.
لذلك يتم بناء البرنامج
تمامًا بالطريقة
التي نريدها دون
أن نضطر لتذكر
تلك الطلاسم السحرية كما تبدو.
وبالرغم من أن هذا يعمل فقط
على برامج بسيطة مثل هذا.
إلا أنه في الواقع، فربما واجه
البعض منكم من ذوي المشكلات الأخيرة
أخطاء في التجميع
والتي في الواقع
لم تصادفنا عن قصد في
الفصل لأن أداة Make كانت تساعدنا.
في الواقع، بمجرد قيامك
بتحسين برنامج ما
ليأخذ بالفعل مدخلات المستخدم باستخدام
مكتبة CS50 بتضمين CS50 نقطة H،
فربما يكون البعض منكم قد أدرك
أن أداة تحديد الوصول، وبشكل أعمّ أداة Clang،
إذ فجأةً،
لم تكن تعرف ما هو get_string.
وبصراحة، ربما لم تكن أداة Clang حتى
تعرف ما هي السلسلة.
وذلك لأن هاتين الأداتين
هما ميزتان لمكتبة CS50
واللتين يجب عليك تعليمهما لأداة Clang.
ولكن لا يكفيك تعليم أداة Clang كيف تبدوان،
من خلال تضمين CS50.h.

English: 
But in layman's terms,
what does it do for us?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: compiles it.
And it essentially figures out
all of those otherwise cryptic
looking command line arguments.
Like dash-o something, and so forth.
So that the program
is built just the way
we want it without
our having to remember
those seemingly magical incantations.
And though that only works for
programs as simple as this.
In fact, some of you with
the most recent problems that
might have encountered compilation
errors that we actually
did not encounter deliberately in
class because Make was helping us out.
In fact, as soon as
you enhance a program
to actually take user input using
CS50's library by including CS50 dot H,
some of you might have realized
that all of a sudden the sandbox,
and more generally Clang,
didn't know what get_string was.
And frankly, Clang might not
even known what a string was.
And that's because those two
are features of CS50's library
that you have to teach Clang about.
But it's not enough to teach Clang what
they look like, as by including CS50.h.

Arabic: 
يتضح أن هناك خطوة
ناقصة تساعدنا أداة Make في حلها
لكن يمكنك أيضًا حلها
يدويًا إذا أردت.
وبذلك فأنا أعني هذا، بدلاً من
التحويل البرمجي لبرنامج فقط باستخدام Clang،
hello.c.
عندما تريد استخدام مكتبة
CS50، تحتاج بالفعل
لإضافة وسيط سطر
الأوامر الإضافي هذا.
على وجه التحديد في النهاية، لا يمكن
الانتقال في البداية مثل dash-O.
وتشير dash-L إلى الرابط.
وهذه طريقة لإخبار Clang،
وبالمناسبة عند التحويل البرمجي للبرنامج الخاص بي،
فيُرجى الربط في مستوى الأصفار والواحدات في CS50
والتي كتبناها نحن طاقم العمل
قبل بضعة أسابيع
وقمنا بتثبيتها لك في أداة تحديد الوصول.
إذن فقد حصلتَ على
الأصفار والواحدات الخاصة بك ومن ثم
حصلتَ على الأصفار والواحدات
الخاصة بنا إذا جاز التعبير.
ويتم نطق dash-LCS50
لربطها معًا.
لذا فأيًا ما كنتَ تحصل نوعًا ما على خطأ مرجعي
غير معرّف إلى get_string
أو لم تحصل--
فقد تعذر علينا إجراء تحويل برمجي لبرنامج
استخدم للتو أيًا من دوالّ get
من مكتبة CS50.
والاحتمالات هي، ربما قد تم إصلاح
هذا التغيير البسيط dash-LCS50.
لكن بالطبع، هذا ليس شيئًا مثيرًا للاهتمام
لكي نتذكره، فما بالك
بتذكر كيفية استخدام dash-0
كذلك، عند النقطة التي
يصبح الأمر فيها مملاً حقًا للكتابة.

English: 
Turns out there's a missing
step that Make helps us solve
but that you too can just
solve manually if you want.
And by that I mean this, instead of
compiling a program with just Clang,
hello.c.
When you want to use CS50's
library, you actually
need to add this additional
command line argument.
Specifically at the end, can't
go in the beginning like dash-O.
And dash-L stands for link.
And this is a way of telling Clang,
by the way when compiling my program,
please link in CS50's zeros
and ones that we the staff
wrote some weeks ago and
installed in the sandbox for you.
So you've got your
zeros and ones and then
you've got our zeros
and ones so to speak.
And dash-LCS50 says
to link them together.
So if you were getting some kind of
undefined reference error to get_string
or you didn't--
you weren't able to compile a program
that just used any of the get functions
from CS50's library.
Odds are, this simple change
dash-LCS50 would have fixed.
But of course, this isn't interesting
stuff to remember, let alone
remembering how to use dash-0
as well, at which point
the command gets really tedious to type.

English: 
So here comes, Make again.
Make automates all of this for us.
And in fact, if you henceforth
start running Make and then
pay closer attention to the fairly
long line of output that it outputs,
you'll actually see
mention of dash-LCS50,
you'll see mention of even
dash-LM, which stands for math.
So if you're using
round, for instance, you
might have discovered
that round two also
doesn't work out of the box
unless you use Make itself
or this more nuanced approach.
So this is all to say that
compiling is a bit of a white lie.
Like, yes you've been compiling and
you've been going from source code
to machine code.
But it turns out that there's been
a number of other steps happening
for you that we're going to
just slap some labels on today.
At the end of the day, we're
just breaking the abstraction.
So compiling is this abstraction
from source code to machine code.
Let's just kind of zoom
in briefly to appreciate
what it is that's going on in
hopes that it makes the code we're
compiling a little more understandable.
So step one of four, when it comes
to actually compiling a program
is called Pre-processing.
So recall that this program we
just looked at had a couple of

Arabic: 
لذا هنا تأتي، أداة Make مجددًا.
تقوم أداة Make بالتشغيل التلقائي لكل هذا لأجلنا.
وفي الواقع، إذا كنتَ من الآن فصاعدًا
ستبدأ في تشغيل أداة Make ثم
تولي مزيدًا من الاهتمام لسطر المخرجات
الطويل تمامًا والذي تقوم الأداة بإخراجه،
فسترى فعليًا
إشارةً لـ dash-LCS50،
سترى إشارة كذلك إلى
dash-LM، والتي تشير إلى الرياضيات.
لذا إذا كنت تستخدم جولة،
على سبيل المثال، فربما اكتشفتَ
أن الجولة
الثانية أيضًا
لا تعمل خارج الصندوق
إلا إذا استخدمت أداة Make نفسها
أو هذا النهج الأكثر دقة.
لذا فكل ما يمكن قوله هو أن
التحويل البرمجي ما هو إلا كذبة بيضاء.
مثلاً، نعم لقد قمتَ بالتحويل البرمجي
وكنتَ تنتقل من التعليمة البرمجية للمصدر
إلى التعليمة البرمجية للآلة.
ولكن يتضح أنه كان هناك
عدد من الخطوات الأخرى التي تحدث
لك والتي سنقوم
فقط بوضع بعض التسميات عليها اليوم.
في نهاية اليوم، سنقوم
فقط بكسر التجريد.
لذا فإن التحويل البرمجي هو هذا التجريد
من التعليمة البرمجية للمصدر إلى التعليمة البرمجية للآلة.
دعونا نقوم فقط نوعًا ما بالتكبير
لفترة وجيزة لتقدير
ما يجري هنا على أمل أن
يجعل التعليمة البرمجية
التي نقوم بتحويلها برمجيًا أكثر قابلية للفهم.
لذا فالخطوة الأولى من أربعة، والتي تتعلق
بتحويل برمجي لبرنامج بالفعل
تُسمى مرحلة المعالجة المسبقة.
لذلك تذكروا أن هذا البرنامج الذي
اطّلعنا عليه للتو كان فيه زوج

Arabic: 
من التضمينات بأعلى الملف.
وهما يعرفان عامةً
باسم توجيهات المعالجة المسبقة.
ليس مصطلحًا مثيرًا للاهتمام
بشكل خاص ولكن يتم
ترسيمه بواسطة
علامة التجزئة في بداية هذه السطور.
وتلك إشارة إلى Clang أنه يجب
معالجة هذه الأشياء أولاً.
أن تتم معالجتها مسبقًا.
المعالجة قبل أي شيء آخر.
وفي الواقع، فإن السبب وراء هذا
قد ناقشناه في الأسبوع الماضي، ضمن CS50.h
ما هو، على سبيل المثال؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: على وجه الخصوص،
إعلان دوالّ get string.
لذلك توجد بعض سطور التعليمة البرمجية،
النموذج الأولي إذا كنتم تذكرون،
الذي يكون هو سطر التعليمة البرمجية الذي يعلّم
Clang ما هي المدخلات لـ get_string
وما هي المخرجات.
نوع الإرجاع ونوع
الوسيطات، إذا جاز التعبير.
وهكذا عندما تقوم بتضمين
CS50.h في أعلى الملف، فما
يحدث عندما تقوم بتشغيل Clang
لأول مرة خلال ما يسمى بخطوة المعالجة المسبقة،
هو أن أداة Clang تبحث على القرص الصلب
عن الملف المسمى حرفيًا باسم CS50.h.
وهي تمسك بمحتوياتها وتقوم أساسًا
بالعثور على هذا السطر واستبداله هنا.
لذا يوجد في مكان ما في CS50.h خط
كهذا الأصفر الظاهر هنا

English: 
includes at the top of the file.
These are generally known
as pre-processor directives.
Not a particularly
interesting term but they're
demarcated by the hash at
the start of these lines.
That's a signal to Clang that these
things should be handled first.
Preprocessed.
Process before everything else.
And in fact, the reason for this we
did discuss last week, inside of CS50.h
is what, for instance?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: Specifically,
the declaration of get strings.
So there's some lines of code,
the prototype if you recall,
that one line of code that teaches
Clang what the inputs to get_string are
and what the outputs are.
The return type and the
arguments, so to speak.
And so when you have include
CS50.h at the top of the file, what
is happening when you first run Clang
during this so-called pre-processing
step, is Clang looks on the hard drive
for the file literally called CS50.h.
It grabs its contents and essentially
finds and replaces this line here.
So somewhere in CS50.h is a
line like this yellow one here

English: 
that says get_string, is a
function that returns a string.
And it takes as input, the
so-called argument, a string
that we'll call prompt.
Meanwhile, with include standard I/O.
What's the point of including that?
What is declared inside
of that file presumably?
Yeah?
AUDIENCE: It's the standard
inputs and outputs.
DAVID J. MALAN: Standard
inputs and outputs.
And more specifically,
what example there of?
What function?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: So printf.
The other function we keep using.
So inside of standard io.h,
somewhere on the sandbox's hard drive
is similarly a line of code that
frankly looks a little more cryptic
but we'll come back
to this sort of thing
down the road, that says
print if is a function.
Happens to return on int, but
more on that another time.
Happens to take a char* format.
But more on that another time.
Indeed, this is one
of the reasons we hide
this detail early on because
there's some syntax that's
just a distraction for now.
But that's all that's going on.
The sharp include sign is just
finding and replacing the contents.
Plus dot, dot, dot, a bunch of
other things in those files as well.
So when we say
pre-processing, we just mean
that that's getting substituted in
so you don't have to copy and paste

Arabic: 
يقول إن get_string، هي دالّة
تقوم بإرجاع سلسلة.
كما يأخذ كمُدخَل،
سلسلةً سنطلق عليها prompt "مطالبة"،
والتي تسمى وسيطة.
وفي الوقت نفسه، مع تضمين الإدخال/الإخراج القياسي.
فما الهدف من تضمين ذلك؟
ما المفترض أن يُعلن عنه
بداخل ذلك الملف؟
أجل؟
الجمهور: إنها المدخلات
والمخرجات القياسية.
ديفيد ج. مالان: المدخلات
والمخرجات القياسية.
وبصورةٍ أكثر تحديدًا،
ما هو المثال الموجود هناك؟
أي دالة؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: إذن هي printf.
الدالّة الأخرى التي نستمر باستخدامها.
لذا فضمن io.h القياسي،
في مكان ما على القرص الصلب الخاص بأداة تحديد الوصول
يوجد بالمثل سطر من التعليمة البرمجية
يبدو بصراحة غامضًا بدرجة أكثر قليلاً
لكننا سنعود
لهذا النوع من الأشياء
في الطريق، والذي يقول
إن printf هي دالّة.
يحدث رجوع إلى int، لكن
بأكثر من ذلك في وقتٍ آخر.
يحدث أخذ تنسيق char*.
لكن أكثر من ذلك في وقتٍ آخر.
في الواقع، هذا هو أحد
الأسباب التي تجعلنا نُخفي
هذه التفاصيل في وقت مبكر نظرًا
لوجود بناء جملة ما لا يمثل
إلا تشتيتًا في الوقت الراهن.
لكن هذا كل ما يحدث.
تقوم علامة التضمين الحاد فقط
بالعثور على المحتويات واستبدالها.
زائد نقطة، نقطة، نقطة، مجموعة من
أشياء أخرى في تلك الملفات كذلك.
لذا عندما نقول
مرحلة المعالجة المسبقة، فإننا نعني فقط
أن يتم استبدالها
حتى لا تضطر إلى النسخ واللصق

English: 
this sort of thing manually yourself.
So "compiling" is a word that
actually has a well-defined meaning.
Once you've preprocessed your code, and
your code looks essentially like this,
unbeknownst to you, then comes
the actual compilation step.
And this code here gets
turned into this code here.
Now this is scary-looking,
and this is the sort of thing
that if you take a class
like CS61 at Harvard,
or, more generally, systems
programming, so to speak,
you might see something like this.
This is x86 64-bit
assembly instructions.
And the only thing interesting
about that claim for the moment
is that assembly--
I kind of alluded to that
earlier-- assembler output, a.out.
There's actually a relationship
here, but long story short, these
are the lower level
instructions that only the CPU,
the brain inside your
computer, actually understands.
Your CPU does not understand C. It
doesn't understand Python or C++
or Java or any language with
which you might be familiar.
It only understands this
cryptic-looking thing.
But frankly, from the looks of it, you
might glean that probably not so much
fun to program in this.

Arabic: 
لهذا النوع من الأشياء يدويًا بنفسك.
لذا، فإن "التحويل البرمجي" هي كلمة لها
في الواقع معنى محدد جيدًا.
فبمجرد إجرائك لمرحلة المعالجة المسبقة،
فستبدو التعليمة البرمجية لديك في الأساس كهذه،
دون علمك، ثم تأتي
خطوة التحويل البرمجي الفعلية.
وتتحول هذه التعليمة البرمجية هنا
إلى هذه التعليمة البرمجية هنا.
يبدو هذا الآن مخيفًا،
وهذا شيء نوعًا ما يشبه
كأن تحصل على دورة دراسية
مثل CS61 في جامعة هارفارد،
أو، بشكلٍ أعمّ، برمجة الأنظمة،
إذا جاز التعبير،
فقد ترى شيئًا مشابهًا لهذا.
هذه هي تعليمات تجميعة
x86 64-bit.
والشيء الوحيد المثير للاهتمام هو
بشأن هذا الادعاء في الوقت الحالي
بأن تلك التجميعة--
وقد أشرتُ نوعًا ما إلى ذلك
من قبل-- هي مُخرَج برنامج التجميع، a.out.
هناك بالفعل علاقة
هنا، ولكن خلاصة القول، هذه
هي التعليمات من المستوى الأدنى
التي تفهمها فقط وحدة المعالجة المركزية (CPU)،
العقل الموجود داخل جهاز
الكمبيوتر لديك.
وحدة المعالجة المركزية الخاصة بك لا تفهم لغة C.
وهي لا تفهم Python أو C++
أو Java أو أي لغة
قد تكون مألوفة لديك.
إنها تفهم فقط هذا
الشيء الذي يبدو غامضًا.
ولكن بصراحة، بمجرد النظر إليها، فقد
تكتشف أن البرمجة في هذه الوحدة ربما
ليست بالأمر الممتع.

Arabic: 
أعني، يمكن القول، إنها ليست
على هذا القدر الممتع للبرمجة في لغة C،
لذلك فهذا يبدو أكثر غموضًا.
ولكن لا مشكلة.
فلُغة C والكثير من اللغات
هي مجرد هذه التجريدات
الموجودة بأعلى برامج المستوى الأدنى
التي تفهمها وحدات المعالجة المركزية بالفعل
لذا فلا داعي لأن نقلق
بشأن هذا الموضوع إلى هذا الحد.
ولكن إذا سلطنا الضوء على بضعة مصطلحات،
سترى بعض الأشياء المألوفة هنا.
لذا فالمصطلح الأساسي تتم الإشارة إليه
في هذا المعروف باسم التعليمة البرمجية للتجميع.
ترون الإشارة إلى دالتي
get string و printf،
لذا فنحن لا نضيّع المعلومات.
إنه يُقدَّم حقًا بلُغة
مختلفة، لغة التجميع.
الآن يمكنكم اكتشاف، ربما، من بعض
من أسماء هذه التعليمات،
هذا ما يعنيه شعار Intel Inside.
فعندما تتمكن Intel أو أي علامة تجارية من
وحدات المعالجة المركزية من فهم التعليمات،
فهذا يعني أشياء مثل الدفع
والتحريك والطرح والاتصال.
وهذه كلها دوالّ وأفعال
منخفضة المستوى،
إذا جاز التعبير، ولكن في
مستوى وحدة المعالجة المركزية.
ولكن لتفاصيل أكثر من ذلك، يمكنكم
الحصول على دورات كاملة.
ولكن فقط لكشف النقاب
عن هذا اليوم،
فهذه خطوة كانت تحدث لنا
بطريقة سحرية دون علم أحد،
بفضل Clang.

English: 
I mean, arguably, it's not that
much fun to program yet in C,
So this looks even more cryptic.
But that's OK.
C and lots of languages
are just these abstractions
on top of the lower level
stuff that the CPUs do actually
understand so that we don't
have to worry about it as much.
But if we highlight a few terms,
here you'll see some familiar things.
So main is mentioned in this
so-called assembly code.
You see mention of
get string and printf,
so we're not losing information.
It's just being presented in really a
different language, assembly language.
Now you can glean, perhaps, from some
of the names of these instructions,
this is what Intel Inside means.
When Intel or any brand of
CPU understands instructions,
it means things like pushing and
moving and subtracting and calling.
These are all low
level verbs, functions,
if you will, but at
the level of the CPU.
But for more on that, you
can take entire courses.
But just to take the hood
off of this for today,
this is a step that's been happening
for us magically unbeknownst
to us, thanks to Clang.

Arabic: 
إذن التجميع-- الآن وقد حصلتَ على هذه
التعليمة البرمجية التي تبدو غامضة والتي لن
نراها مجددًا-- لن تحتاج
إلى مُخرَج مجددًا--
فما الذي ستفعله به؟
حسنًا، قلتم سابقًا إن أجهزة الكمبيوتر
تفهم فقط الأصفار والواحدات،
إذن فالخطوة الثالثة هي في الواقع تحويل
لغة التجميع هذه إلى أصفار وواحدات فعلية
تبدو الآن هكذا.
لذا تحدث خطوة
التجميع، دون علمك،
في كل مرة تقوم فيها بتشغيل
Clang أو، بدورها، بتشغيل
أداة make، فنحصل على أصفار
وواحدات من التعليمة البرمجية للتجميع،
وسنحصل على التعليمة البرمجية للتجميع
في C-code لديك.
لكن إليكم الخطوة الرابعة والأخيرة.
تذكروا أننا نحتاج للربط
مع الأصفار والواحدات لدى أشخاص آخرين.
إذا كنت تستخدم دالة printf
فأنت لم تكتب تلك الدالة.
إنما قام شخصٌ آخر بإنشاء تلك الأصفار
والواحدات، وهي الأنماط
التي يفهمها الكمبيوتر.
أنت لم تنشيء get string.
نحن فعلنا، لذا تحتاج للوصول إلى
تلك الأصفار والواحدات
حتى يتمكن برنامجك
من استخدامها أيضًا.
لذا الربط، في الأساس، يفعل هذا.
إذا كنت قد كتبت برنامجًا--
على سبيل المثال، hello.c--
وحدث وأن استخدم
زوجًا من المكتبات الأخرى،
وهي الملفات التي كتبها أشخاص
آخرون لتعليمة برمجية مفيدة
لك، مثل cs50.c،
والتي تجدها في مكانٍ ما،

English: 
So assembling-- now that you've got this
cryptic-looking code that we will never
see again-- we'll never
need to output again--
what do you do with it?
Well, you said earlier that computers
only understand zeros and ones,
so the third step is actually to convert
this assembly language to actual zeros
and ones that now look like this.
So the assembling step
happening, unbeknownst to you,
every time you run
Clang or, in turn, run
make, we're getting zeros and
ones out of the assembly code,
and we're getting the assembly
code out of your C-code.
But here's the fourth and final step.
Recall that we need to link in
other people's zeros and ones.
If you're using printf
you didn't write that.
Someone else created those
zeros and ones, the patterns
that the computer understands.
You didn't create get string.
We did, so you need access
to those zeros and ones
so that your program
can use them as well.
So linking, essentially, does this.
If you've written a program--
for instance, hello.c--
and it happens to use a
couple of other libraries,
files that other people
wrote of useful code
for you, like cs50.c,
which does exist somewhere,

Arabic: 
وحتى stdio.c، والذي
يوجد بالفعل في مكانٍ ما،
أو من الناحية التقنية،
فالإدخال/الإخراج القياسي هو كمكتبة كبيرة،
قاموا فيها بوضع دالّة printf في ملف
سُمّي خصيصًا printf.c.
ولكن في مكانٍ ما في محرك الأقراص الثابت
لأداة تحديد الوصول، في كل أجهزة Mac وأجهزة الكمبيوتر الشخصي،
إذا كانت تدعم التحويل البرمجي، فهي، على سبيل المثال،
مثل هذه الملفات.
ولكن كان علينا تحويل هذا إلى
أصفار وواحدات، وهذا، وهذا،
ثم نقوم بدمجها بطريقةٍ ما.
لذلك، بالصور، يبدو هذا
مثل هذا نوعًا ما.
وهذا كله يحدث
تلقائيًا بواسطة Clang.
Hello.c، التعليمة البرمجية التي كتبتها،
يتم تحويلها برمجيًا
للتجميعة، والتي يتم تجميعها بعد ذلك
إلى أصفار وواحدات، والتي تُسمى باسم التعليمة البرمجية
للآلة أو التعليمة البرمجية للكائن.
Cs50.c-- فعلنا هذا لكم
قبل بدء الفصل الدراسي.
تم إنشاء Printf قبل
أن يبدأ أحدنا بعقود
مضت ويبدو مثل هذا.
هذه ثلاثة ملفات منفصلة،
على الرغم من ذلك، فإن خطوات الربط حرفيًا
تعني، ربط كل هذه الأشياء
معًا، وجمع الأصفار
والآحاد من، مثلاً، ثلاثة
ملفات منفصلة، على الأقل،
ودمجهم فقط
بطريقة تعرفها الآن
وحدة المعالجة المركزية عن كيفيه استخدام ليس فقط
تعليماتك البرمجية لكن أيضًا printf وget string
وهكذا.

English: 
and even stdio.c, which
does exist somewhere,
or technically, Standard
IO is such a big library,
they actually put printf in a
file specifically called printf.c.
But somewhere in the sandbox's hard
drive, in all of our Macs and PCs,
if they support compiling, are,
for instance, files like these.
But we've got to convert this to
zeros and ones, this, and this,
and then somehow combine them.
So pictorially, this just
looks a bit like this.
And this is all happening
automatically by Clang.
Hello.c, the code you
wrote, gets compiled
to assembly, which then gets assembled
into zeros and ones, so-called machine
code or object code.
Cs50.c-- we did this for you
before the semester started.
Printf was done way before
any of us started decades
ago and looks like this.
These are three separate files,
though, so the linking step literally
means, link all of these things
together, and combine the zeros
and ones from, like, three,
at least, separate files,
and just combine them
in such a way that now
the CPU knows how to use not just
your code but printf and get string
and so forth.

Arabic: 
في الأسبوع الماضي، قدمنا
التحويل البرمجي على هيئة عمليات تجريد،
إذا جاز التعبير، وهذا هو كل ما
عنيناه حقًا طوال هذا الوقت.
لكن الآن رأينا ماذا
يحدث تحت الغطاء،
ويمكننا تحديد أن
وحدة المعالجة المركزية والتي تبدو بصورة مادية
مثل هذا، وإن كانت تبدو أصغر
في الكمبيوتر المحمول أو أجهزة كمبيوتر سطح المكتب،
تعرف كيف تتعامل مع كل هذا.
أية أسئلة حول هذه الخطوات الأربع--
ما قبل المعالجة، والتحويل البرمجي،
والتجميع ، والربط؟
ولكن بشكل عام، الآن، يمكن أن نطلق فقط
عليهم تحويل برمجي، كما يفعل معظم الناس.
أية أسئلة؟
أجل.
الجمهور: كيف تعرف وحدة المعالجة المركزية
أن هناك [INAUDIBLE]؟
هل هذا [INAUDIBLE]؟
DAVID J. MALAN: ليس في
خطوة ما قبل المعالجة،
وبالتالي فإن السؤال هو، كيف
يعرف الكمبيوتر
أن printf هي الدالة
الوحيدة الموجودة هناك؟
بشكل أساسي، عندما
تقوم بالربط في التعليمات البرمجية،
فقط الأصفار والآحاد الضرورية
عادةً هي التي ترتبط.
أحيانًا، تحصل على أكثر مما تحتاج إليه
بالفعل، إذا كانت مكتبة كبيرة،
لكن هذا جيد، أيضًا.
تلك الأصفار والواحدات
لا تستخدمها وحدة المعالجة المركزية أبدًا.
سؤال جيد.

English: 
So last week, we introduced
compiling as an abstraction,
if you will, and this is all that
we've really meant this whole time.
But now that we've seen what's
going on underneath the hood,
and we can stipulate that
my CPU that looks physically
like this, albeit smaller
in a laptop or desktop,
knows how to deal with all of that.
So any questions on these four steps--
pre-processing, compiling,
assembling, linking?
But generally, now, we can just call
them compiling, as most people do.
Any questions?
Yeah.
AUDIENCE: How does the CPU
know that [INAUDIBLE] is there?
Is that [INAUDIBLE]?
DAVID J. MALAN: Not in
the pre-processing step,
so the question is,
how does the computer
know that printf is the
only function that's there?
Essentially, when
you're linking in code,
only the requisite zeros and
ones are typically linked in.
Sometimes you get more than you
actually need, if it's a big library,
but that's OK, too.
Those zeros and ones are
just never used by the CPU.
Good question.

Arabic: 
أية أسئلة أخرى؟
لا بأس، جسنًا.
بما أننا نعرف أن هذا
ممكن، فلنبدأ
في تصميم طريق العودة الخاص بنا،
لأن الجميع هنا
ربما يعرف الآن أنه
عند الكتابة بلغة C، والتي
نوعًا ما من الناحية
النظرية، يبدو أنها، لا تخلو
من العقبات والمشاكل
والأخطاء والغلطات.
لذلك دعونا نقدم بعض التقنيات
والأدوات التي يمكنكم من الآن فصاعدًا،
من بداية هذا الأسبوع وما بعده،
محاولة استكشاف هذه الأخطاء وإصلاحها بأنفسكم
بدلاً من مجرد محاولة قراءة
رسائل الخطأ التي تبدو مشفرة
أو طلب مساعدة شخص آخر.
دعونا نرى ما إذا كان البرنامج يستطيع في الواقع
الإجابة عن بعض هذه الأسئلة لكم.
لذا دعوني أمضي قُدمًا وأفعل هذا.
دعوني أمضي قدمًا
وأفتح أداة تحديد وصول هنا،
وسأمضي قدمًا
وأُنشئ ملفًا جديدًا باسم
buggy0.c والذي سأرتكب فيه، هذه
المرة، خطأً عن عمد.
وسأمضي قدمًا
وأُنشئ دالة خاصة بي باسم
main، والتي، تعد بمثابة الحالة الافتراضية،
مثل النقر على العلم الأخضر.
وسأمضي قدمًا وأقول
printf، علامة اقتباس، علامة اقتباس خاتمة،
"Hello world/m."
حسنًا.
يبدو هذا جيدًا جدًا.

English: 
Other questions?
OK, all right.
So now that we know this
is possible, let's start
to build our way back
up, because everyone here
probably knows now that
when writing in C, which
is kind of up here
conceptually, like, it
is not without its hurdles and
problems and bugs and mistakes.
So let's introduce a few techniques and
tools with which you can henceforth,
starting this week and beyond, trying
to troubleshoot those problems yourself
rather than just trying to read through
the cryptic-looking error messages
or reach out for help to another human.
Let's see if software can actually
answer some of these questions for you.
So let me go ahead and do this.
Let me go ahead and
open up a sandbox here,
and I'm going to go ahead
and create a new file called
buggy0.c in which I will, this
time, deliberately introduce a bug.
I'm going to go ahead and
create my function called
main, which, again, is the default,
like when green flag is clicked.
And I'm going to go ahead and
say, printf, quote, unquote,
"Hello world/m."
All right.
Looks pretty good.

English: 
I'm going to go ahead and
compile buggy0, Enter,
and of course, I get a bunch
of error messages here.
Let me zoom in on them.
Fortunately, I only have two, but
remember, you have to, have to,
have to always scroll
up to look at the first,
because there might just be an annoying
cascading effect from one earlier
bug to the later.
So buggy0.c, line 5, is what this
means, character 5, so like 5 spaces in,
implicitly declaring library
function printf with dot, dot, dot.
So you're going to start to see
this pretty often if you make
this particular mistake or oversight.
Implicitly declaring
something means you forgot
to teach Clang that something exists.
And you probably know from experience,
perhaps now, what the solution is.
What's the first mistake I made here?
AUDIENCE: [INAUDIBLE].
DAVID J. MALAN: Yeah, I didn't
include the header file,
so to speak, for the library.
I'm missing, at the top of
the file, include stdio.h,
in which printf is defined.
But let's propose that you're not
quite sure how to get to that point,
and how can we get, actually,
some help with this?
Let me actually increase
the size of my terminal

Arabic: 
سأمضي قدمًا وأحول
buggy0 برمجيًا، وأضغط Enter،
وبالطبع، لدي مجموعة من
رسائل الخطأ هنا.
دعوني أقوم بتكبيرها.
لحسن الحظ، لدي اثنتان فقط، ولكن
تذكروا، يجب عليكم،
دائمًا التمرير
لأعلى للبحث في البداية،
لأنه قد يكون هناك
تأثير متسلسل مزعج من
الخطأ السابق على الخطأ اللاحق.
إذن، buggy0.c، السطر 5، هي ما يعنيه هذا،
الحرف 5، إذن كمثل 5 مسافات بالداخل،
لتعلن ضمنيًا عن دالّة
مكتبة printf مع نقطة، نقطة، نقطة.
إذن ستبدؤون في رؤية
هذا في كثير من الأحيان إذا قمتم
بهذا الخطأ المعين أو السهو.
الإعلان ضمنيًا عن شيء
ما يعني أنك نسيت
أن تخبر Clang بوجود شيء ما.
وربما تعرفون من التجربة، ربما
الآن، ما هو الحل.
ما أول خطأ ارتكبتُه هنا؟
الجمهور: [INAUDIBLE].
ديفيد ج. مالان: أجل، لم أقم
بتضمين ملف الرأس،
إذا جاز التعبير، للمكتبة.
لا أجد، في أعلى
الملف، تضمين stdio.h،
التي يتم فيها تعريف printf.
ولكن دعونا نقول إنكم لم تكونوا
متأكدين تمامًا من كيفية الوصول إلى تلك المرحلة،
وكيف يمكننا، فعليًا، الحصول على
بعض المساعدة في هذا الأمر؟
اسمحوا لي في الواقع بزيادة
حجم النافذة الطرفية الخاصة بي

English: 
here, and recall that just a
moment ago, I ran makebuggy0,
which yielded the errors that I saw.
It turns out that
installed in the sandbox
is a command that we, the
staff, wrote called help50.
And this is just a program we
wrote that takes as input any error
messages that your code or
some program has outputted.
We kind of look for
familiar words and phrases,
just like a TF would in office hours,
and if we recognize some error message,
we're going to try to provide,
either rhetorically or explicitly,
some advice on how to handle.
So if I go ahead and run this command
now, notice there's a bit more output.
I see exactly the same output in
white and green and red as before,
but down below is some yellow, which
comes specifically from help50.
And if I go ahead and
zoom in on this, you'll
see that the line of
output that we recognized
is this one, that same one
I verbally drew attention
to before-- buggy0.c, line 5, error,
implicitly declaring library function
printf, and so forth.
So here, without the background
highlighting, but still in yellow,
is our advice or a question a TF or
CA might ask you in office hours.

Arabic: 
هنا، وتذكروا أنه قبل
دقيقة فقط، قمت بتشغيل makebuggy0،
والذي أسفر عن الأخطاء التي رأيتُها.
من الواضح أنه تم
تثبيت أمر في أداة تحديد الوصول
قمنا بكتابته، نحن طاقم العمل،
ويسمى help50.
وهذا مجرد برنامج قمنا بكتابته
يأخذ أي رسالة خطأ
أخرجتها التعليمة البرمجية لديك
أو برنامج ما كإدخال.
فنحن نوعًا ما نبحث عن
العبارات والكلمات المألوفة،
تمامًا مثلما يفعل رفيق التدريس في ساعات العمل،
وإذا تعرفنا على رسالة خطأ ما،
فسنحاول تقديم، سواء
بشكل بياني أو صريح،
نصيحة ما حول كيفية التعامل معها.
لذا إذا مضيت قدمًا وشغّلت هذا الأمر
الآن، فلاحظوا أن هناك المزيد من المخرجات بشكل قليل.
أنا أرى بالضبط المخرج نفسه
بالأبيض والأخضر والأحمر كما كان من قبل،
لكن في الأسفل يوجد بعض الأصفر،
والذي يأتي تحديدًا من help50.
وإذا مضيت قدمًا وقمت
بتقريب الصورة على هذا، سوف
ترون أن سطر الإخراج
الذي تعرفنا عليه
هو هذا السطر، السطر نفسه
الذي قمت حرفيًا بلفت الانتباه
إليه من قبل-- buggy0.c، السطر 5،
خطأ، ليعلن ضمنيًا عن دالة المكتبة
printf، وهكذا.
إذن هنا، بدون تمييز الخلفية،
لكنها تظل باللون الأصفر،
هي نصيحتنا أو سؤال قد يطرحه عليك رفيق تدريس
أو مساعد في دورة تدريبية في ساعات العمل.

English: 
Well, did you forget to
include stdio.h in which printf
is declared atop your file?
And hopefully, our questions,
rhetorical or otherwise, are correct,
and that will get you further along.
So let's go ahead and try that advice.
So include stdio.h.
Now let me go ahead
and go back down here.
And if you don't like
clutter, you can type "clear,"
or hit Control+L in the terminal
window to keep cleaning it like I do.
If you want to go ahead now and run
makebuggy0, Enter, fewer errors,
so that's progress, and not the same.
So this one's, perhaps, a little easier.
Reading the line, what
line of code is buggy here?
AUDIENCE: Forgot the semicolon.
DAVID J. MALAN: Yeah, so this is
now still on line 5, it turns out,
but for a different reason.
I seem to be missing a semi-colon.
But I could similarly ask
help50 for help with that
and hope that it recognizes my error.
So this, too, should start
being your first instinct.
If on first glance, you
don't really understand
what an error message is
doing, even though you've
scrolled to the very first one, like
literally ask this program for help
by rerunning the exact
same command you just

Arabic: 
حسنًا، هل نسيت تضمين
stdio.h الذي يتم الإعلان عن printf
فيه في أعلى ملفك؟
ونحن نأمل، أن تكون أسئلتنا،
سواء بشكل بياني أو بخلاف ذلك، صحيحة،
لأن هذا سيجعلكم تحققون المزيد.
لذا دعونا نمضي قدمًا ونجرّب تلك النصيحة.
إذن ضمّنوا stdio.h.
الآن اسمحوا لي بالمضي
قدمًا والعودة إلى أسفل هنا.
وإذا كنتم لا تحبون الفوضى،
فيمكنكم كتابة "clear،"
أو الضغط على Control+L في النافذة
الطرفية لترتيبه باستمرار كما أفعل.
إذا أردت المضي قدمًا الآن وتشغيل
makebuggy0، Enter، أخطاء أقل،
أحرزنا تقدمًا، ولكنه ليس الأمر نفسه.
لذا هذه الدالة، ربما، تكون أسهل قليلاً.
قراءة السطر، ما هو سطر التعليمة
البرمجية الذي به أخطاء هنا؟
الجمهور: نسيت الفاصلة المنقوطة.
ديفيد ج. مالان: أجل، من الواضح أن،
الخطأ ما زال في السطر 5،
لكن لسبب آخر.
يبدو أنني نسيت فاصلة منقوطة.
ولكن يمكن أن أسأل بالمثل
help50 للمساعدة في ذلك
ونأمل أن يكتشف خطئي.
لذا يجب أن يبدأ هذا،
أيضًا، في أن يكون حدسكم الأول.
إذا لم تفهموا من الوهلة
الأولى حقًا
ماذا تفعل رسالة الخطأ،
حتى ولو قمتم
بالتمرير إلى أول رسالة، كمثل
طلب الحصول حرفيًا على مساعدة من هذا البرنامج
بإعادة تشغيل الأمر نفسه
تحديدًا الذي قمت للتو

English: 
ran, but prefix it with
help50 and a space,
and that will run help50 for you.
Any questions on that process?
All right, let's take a
look at one other program,
for instance, that, this time, has
a different error involved in it.
So how about-- let me go ahead
and whip up a quick program here.
I'll call this buggy2.c for
consistency with some of the samples
we have online for you later.
And in this example, I'm going to
go ahead and write the correct thing
at first, stdio.h, and then I'm
going to have int main void, which
just gets my whole program started.
And then I'm going to have
a loop, and recall for--
[CLEARS THROAT] excuse me--
Mario or some other program,
you might have done something like int
i get 0, i is less than or equal to--
let's do this 10 times, and then i++.
And all I want to do in this program is
print out that value of i, as I can do,
with the %i placeholder--
so a simple program.
Just want it to count from 0 to 10.

Arabic: 
بتشغيله، لكن ابدأه
بـ help50 ومسافة،
وسيقوم هذا بتشغيل help50 لك.
هل هناك أسئلة حول هذه العملية؟
حسنًا، دعونا نلقي
نظرة على برنامج آخر،
على سبيل المثال، فذلك في،
هذه المرة، به خطأ آخر مضمّن فيه.
لذا ماذا عن-- اسمحوا لي بالمضي
قدمًا وإعداد برنامج سريع هنا.
سأسمي هذا buggy2.c
للتناسق مع بعض النماذج
التي لدينا على الإنترنت لكم في وقت لاحق.
وفي هذا المثال، سأمضي
قدمًا وأكتب الشيء الصحيح
أولاً، stdio.h، ثم سيكون
لدي int (main) void، والذي
سيجعل برنامجي بالكامل يبدأ التشغيل.
وبعد ذلك سيكون لدي
تكرار حلقي، وسأذكر--
[CLEARS THROAT] معذرةً--
ماريو أو برنامج ما آخر،
ربما قد تكون قمت بشيء مثل
int i get 0، حيث i أقل من أو يساوي--
دعونا نقوم بذلك 10 مرات، ثم i++.
وكل ما أريد القيام به في هذا البرنامج
هو طباعة قيمة i، مثلما يمكنني القيام بها،
باستخدام العنصر النائب %i--
إذن برنامج بسيط.
فقط أريده أن يعد من 0 إلى 10.

Arabic: 
لذا دعونا نمضي قدمًا ونشغّل
buggy2، أو بالأحرى، فأنا أرغب في--
دعونا لا نقوم بالطباعة--
بالترجيع.
دعونا نمضي قدمًا
ونطبع فقط رمز علامة التجزئة
ولا نقوم بإفساد الحل بهذه الطريقة.
إذن هنا، أنا أمضي
قدمًا وأطبع buggy2.
هدفي الآن هو أنني سأحدد طباعة 10
علامات تجزئة فقط، بمعدل رمز واحد في السطر،
وهو ما أريد القيام به هنا.
والآن سأمضي قدمًا وأشغّل
./buggy2، على أمل، أن أرى،
10 علامات تجزئة.
وأنا أفسدت هذا قليلاً نوعًا ما،
لكن ماذا أرى بدلاً من ذلك؟
أجل، أعتقد أنني أرى أكثر مما أتوقع.
ويمكننا نوعًا ما القيام بالتكبير هنا
والتحقق مرة أخرى، إذن 1، 2، 3، 4، 5، 6، 7،
8، 9، 10، أوه، 11.
11.
الآن قد تشير عيون بعضكم بالفعل
إلى الحل الذي ينبغي أن يكون،
لكن دعونا فقط نقول
إن هذا غير واضح.
وإذا كان بالفعل غير واضح،
وذلك أفضل، فكيف يمكنك
التعامل مع تشخيص
نوع المشكلة هذه، فقط ما لم

English: 
So let's go ahead and run
buggy2, or rather, I want to--
let's not print up--
rewind.
Let's go ahead and just
print out a hash symbol
and not spoil the solution this way.
So here, I go ahead
and print out buggy2.
My goal is now I will stipulate to print
out just 10 hash symbols, one per line,
which is what I want to do here.
And now I'm going to go ahead and run
./buggy2, and I should see, hopefully,
10 hashes.
And I kind of spoiled this a little
bit, but what do I instead see?
Yeah, I think I see more than I expect.
And we can kind of zoom in here and
double check, so 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, ooh, 11.
11.
Now some of your eyes might already be
darting to what the solution should be,
but let's just propose
that it's not obvious.
And if it is actually not obvious,
all the better, so how might
you go about diagnosing this
kind of problem, short of just

English: 
reaching out and asking
a human for help.
This is not a problem
that help50 can help with,
because it's not an error message.
Your program is working.
It's just not outputting
what you wanted it to work,
but it's not an error message from the
compiler with which help50 can help.
So you want to kind of get eyes
into what your program is doing,
and you want to understand, why
are you printing 11 when you really
are setting this up from 0 to 10?
Well, one of the most common
techniques in C or any language,
honestly, is to use printf for just
other purposes-- diagnostic purposes.
For instance, there's not
much going on in this program,
but I'd argue that it would
be interesting for me to know,
and therefore understand
my program, by just,
let's print out this value
of i on each iteration,
as by doing the line of
code that I earlier did,
and just say something
literally like, i is %i.
I'm going to remove this
ultimately, because it's
going to make my program
look a little silly,
but it's going to help me
understand what's going on.

Arabic: 
تتواصل مع أحد
وتطلب منه المساعدة.
ليست هذه المشكلة التي
يمكن لـ help50 مساعدتك فيها،
لأنها ليست رسالة خطأ.
برنامجك يعمل.
إنه فقط لا يقوم بإخراج
ما أردت أن يخرجه،
لكنه ليس رسالة خطأ من المحول البرمجي
الذي يمكن لـ help50 أن يساعده فيها.
إذن أن تريد نوعًا ما مراقبة
ما يقوم به البرنامج،
وتريد فهم، لماذا يطبع
11 عندما تقوم بالفعل
بإعداد هذا من 0 إلى 10؟
حسنًا، إحدى التقنيات الأكثر
شيوعًا في لغة C أو أي لغة،
بصراحة، هو استخدام printf فقط
لأغراض أخرى- أغراض تشخيصية.
على سبيل المثال، لا يوجد الكثير
من الأشياء في هذا البرنامج،
لكن قد أزعم أنه من المهم لي معرفة،
برنامجي وبالتالي فهمه،
فقط عن طريق،
دعونا نطبع قيمة i
هذه في كل تكرار،
بتنفيذ سطر من التعليمة
البرمجية التي قمتُ بها سابقًا،
وقول شيء
حرفيًا مثل i تساوي %i.
سأقوم بإزالة هذا نهائيًا، لأنه
سيجعل برنامجي يبدو
سخيفًا بعض الشيء،
لكنه سيساعدني
في فهم ماذا يحدث.

English: 
Let me go ahead and recompile
buggy2, ./bugg2, and this time,
I see a lot more output.
But if I zoom in, now it's kind of--
now the computer is essentially
helping me understand what's going on.
When i is 0, here's one of them.
When i is 1, here's another.
I is 2, 3, 4, 5, 6, 7, 8,
9, and that looks good.
But if we scroll a little further,
it feels a little problematic
that i can also be 10.
So what's logically the
bug in this program?
AUDIENCE: [INAUDIBLE].
DAVID J. MALAN: Yeah.
I use less than or equal to, because
I kind of confuse the paradigm.
Like programmers tend to
start counting at zero,
apparently, but I want to do this
10 times, and in the human world,
if I want to do something 10 times,
I might count up to and including 10.
But you can't have it both ways.
You can't start at zero
and end at 10 if you
want to do something exactly 10 times.
So there's a couple
of possibilities here.
How might we fix this?
Yeah, so we could certainly
change it to less than.
What's another correct approach?
Yeah, so we could leave this alone
and just start counting at one,
and if you're not actually printing
the values in your actual program,

Arabic: 
اسمحوا لي بالمضي قدمًا وإعادة التحويل البرمجي
لـ buggy2, ./bugg2، وهذه المرة،
أرى الكثير جدًا من المخرجات.
ولكن إذا قمت بالتكبير، الآن نوعًا ما--
الآن الكمبيوتر في الأساس
يساعدني على فهم ماذا يحدث.
عندما تكون i 0، ها هو واحد منهم.
عندما تكون i 1، ها هو واحد آخر.
I تكون 2، 3، 4، 5، 6، 7، 8،
9، وهذا يبدو جيدًا.
ولكن إذا انتقلنا أبعد قليلاً،
تشعر أن الأمر مُشكل قليلاً
أن i يمكن أن تكون 10 أيضًا.
فما هو الخطأ
منطقيًا في هذا البرنامج؟
الجمهور: [INAUDIBLE].
ديفيد ج. مالان: أجل.
أنا أستخدم أقل من أو يساوي، لأنني
نوعًَا ما أخلط بين النمط.
يميل المبرمجون
لبدء العد من الصفر،
على ما يبدو، ولكن أريد أن أفعل هذا
10 مرات، وفي العالم البشري،
إذا كنت أريد أن أفعل شيئًا 10 مرات،
يمكنني العد إلى 10 وتضمينها.
لكنك لا يمكن أن تحصل عليها بكلا الطريقتيتن.
لا يمكنك البدء من الصفر
والانتهاء في 10 إذا كنت
تريد أن تفعل شيئًا بالضبط 10 مرات.
لذا فإن هناك احتمالين هنا.
كيف يمكننا إصلاح هذا؟
نعم، يمكننا بالتأكيد
تغييره إلى أقل من.
ما هو النهج الصحيح الآخر؟
نعم، قد نتمكن من ترك هذا بمفرده
ونبدأ فقط بالعد الآن من واحد،
وإذا كنت لا تطبع في الواقع
القيم في برنامجك الفعلي،

Arabic: 
قد يكون ذلك معقولاً تمامًا، أيضًا.
إنه ليس تقليديًا فقط.
يحصل على الراحة من خلال العد،
بسرعةٍ،من الصفر، لأن هذا فقط
ما يفعله معظم الناس في هذه الأيام.
لكن التقنية هنا
هي مجرد استخدام printf.
مثل، في حالة الشك، استخدم حرفيًا
printf في هذا السطر، في هذا السطر،
في هذا السطر.
في أي مكان قد يحدث شيء مثير
للاهتمام في برنامجك،
فقط استخدمه لطباعة السلاسل
الموجودة في المتغيرات الخاصة بك،
اطبع الأعداد الصحيحة الموجودة في
المتغيرات الخاصة بك، أو أي شيءٍ آخر.
ويسمح لك نوعًا ما
برؤية، إذا جاز التعبير،
ماذا يحدث داخل
البرنامج، printf.
أداة واحدة أخيرة-- لكنها ليست
شائعة، عند كتابة التعليمات البرمجية،
ربما تحصل على شيءٍ سيئ
في وقت مبكر، وخاصةً عندما لا تكون
على دراية تامة بالأنماط.
على سبيل المثال، إذا مضيت
قدمًا وفعلت ذلك
عن طريق حذف مجموعة كاملة من المسافات،
حتى بعد إصلاح هذا الخطأ
بالانتقال من صفر إلى 10،
هل يُعد هذا البرنامج صحيحًا الآن،
إذا كان الهدف هو طباعة 10 رموز شباك؟
أجل، لقد سمعت نعم.
لماذا يُعد صحيحًا؟
بأي منطق؟

English: 
that might be perfectly reasonable, too.
It's just not conventional.
Get comfortable with, quickly, just
counting from zero, because that's just
what most everyone does these days.
But the technique here
is just use printf.
Like, when in doubt, literally use
printf on this line, on this line,
on this line.
Anywhere something is interesting
maybe going on in your program,
just use it to print out the
strings that are in your variables,
print out the integers that are in
your variables, or anything else.
And it allows you to
kind of see, so to speak,
what's going on inside
of your program, printf.
One last tool-- so it's not
uncommon, when writing code,
to maybe get a little sloppy early
on, especially when you're not
quite familiar with the patterns.
And for instance, if
I go ahead and do this
by deleting a whole bunch of whitespace,
even after fixing this mistake
by going from zero to 10,
is this program now correct,
if the goal is to print 10 hashes?
Yeah, I heard yes.
Why is it correct?
In what sense?

Arabic: 
نعم، بالضبط.
لا يزال يعمل.
إنه يطبع رموز الشباك العشرة،
واحد في كل سطر،
لكنه كُتب بطريقة ضعيفة
في ما يخص الأسلوب.
لذلك أذكر أننا نميل إلى
التقييم، والعالم
يميل إلى التفكير في التعليمات البرمجية
بثلاثة طرق على الأقل.
الأولى، الصواب-- هل يفعل
ما يتوجب عليه فعله،
مثل طباعة 10 رموز شباك؟
ونعم، إنه يفعل ذلك، لأن كل
ما فعلته كان حذف المسافات.
لم أغير في الواقع التعليمات البرمجية
أو أكسرها، بعد ذلك الإصلاح.
الثانية هي التصميم، ما مدى كون هذه التعليمات
البرمجية مدروسة، ومكتوبة بصورةٍ جيدة؟
وبصراحة، إن كتابة هذا أمر صعب
نوعًا ما من نواح كثيرة جدا،
لأنها أسطر قليلة جدًا.
ولكن سترى مع مرور الوقت،
مع نمو برامجك،
أن زملاء التدريس والموظفون
يمكنهم أن يقدموا لك الملاحظات
حول تصميم التعليمات البرمجية الخاصة بك.
لكن يُعد الأسلوب سهلاً نسبيًا.
وقد قمت بتدريسه في الغالب
بضرب الأمثلة، إذا صح التعبير،
لأنني كنت منهجيًا جدًا
في اتباع التعليمات البرمجية الخاصة بي
والتأكد من أن كل شيء يبدو
جيدًا جدًا، أو على الأقل جيد
للعين المدربة.
لكن هذه، دعونا فقط
نقول، إنها ليست جيدة.
مثل، محاذاة كل شيء
إلى اليسار، هو أمر صحيح،
لكنه يبدو رديئًا في الأسلوب.
وماذا ستكون الحجة لعدم
كتابة تعليمات برمجية
مثل هذه، وبدلاً من ذلك،
كتابة تعليمات برمجية بالطريقة

English: 
Yeah, exactly.
It still works.
It prints out the 10
hashes, one per line,
but it's poorly written
in the sense of style.
So recall that we tend to
evaluate, and the world
tends to think about code
in at least three ways.
One, the correctness-- does it
do what it's supposed to do,
like print 10 hashes?
And yes, it does, because all
I did was delete whitespace.
I didn't actually change or break
the code after making that fix.
Two is design, like how thoughtful,
how well-written is the code?
And frankly, it's kind of hard
to write this in too many ways,
because it's so few lines.
But you'll see over time,
as your programs grow,
the teaching fellows and staff
can provide you with feedback
on the design of your code.
But style is relatively easy.
And I've been teaching it mostly
by way of example, if you will,
because I've been very
methodically indenting my code
and making sure everything looks
very pretty, or at least pretty
to a trained eye.
But this, let's just
stipulate, is not pretty.
Like, left aligning everything
still works, not incorrect,
but it's poorly styled.
And what would be an
argument for not writing code
like this and, instead,
writing code the way

English: 
I did a moment ago, albeit
after fixing the bug?
Yeah.
AUDIENCE: It'll help you identify
each little subroutine that
goes through the thing, so
you know this section is here.
DAVID J. MALAN: Yeah.
AUDIENCE: [INAUDIBLE] next one,
so you know where everything is.
DAVID J. MALAN: Exactly.
Let me summarize this.
It allows you to see,
more visually, what
are the individual subroutines
or blocks of code doing
that are associated with each other?
Scratch is colorful, and it has
shapes, like the hugging shape
that a lot of the control
blocks make, to make
clear visually to the programmer
that this block encompasses others,
and, therefore, this repeats
block or this forever block
is doing these things
again and again and again.
That's the role that these curly
braces serve, and indentation
in this and in other
contexts just helps it
become more obvious to the
programmer what is inside of what
and what is happening where.
So this is just better
written, because you
can see that the code inside of main
is everything that's indented here.
The code that's inside the for loop
is everything that's indented here.
So it's just for us human
readers, teaching fellows

Arabic: 
التي قمت بها منذ لحظة، وإن كان
بعد إصلاح الخطأ؟
نعم.
الجمهور: ستساعدك في تحديد
كل روتين فرعي
ينتقل من خلال الشيء، لذا
تعلم أن هذا القسم هنا.
ديفيد ج. مالان: أجل.
الجمهور: [INAUDIBLE] التالي،
حتى تعرف مكان كل شيء.
ديفيد ج. مالان: بالضبط.
دعوني ألخّص هذا.
إنها تسمح لكم برؤية،
بطريقة بصرية أكثر، ما الذي
يفعله الروتين الفرعي الفردي
أو كتل التعليمات البرمجية
المرتبطة ببعضها البعض؟
برنامج سكراتش مليء بالألوان، ويحتوى على
أشكال، مثل شكل العناق
والذي تقوم به الكثير من
كتل التعليمات البرمجية،
بالتوضيح بصريًا إلى المبرمج
أن هذه الكتلة تشمل الآخرين،
وبالتالي، أن كتلة repeat
أو كتلة forever
تفعل هذه الأشياء
مرارًا وتكرارًا.
هذه هي القاعدة التي تعمل بها هذه الأقواس
المتعرجة، والمسافات البادئة
في هذا وفي سياقات
أخرى فإنها فقط تساعد في
أن يصبح أكثر وضوحًا
للمبرمج ماذا بداخل ماذا
وماذا يحدث أين.
لذا هذا أفضل في
الكتابة، لأنه
يمكنك رؤية أن التعليمات البرمجية داخل main
هي كل شيء موجود هنا.
التعليمات البرمجية الموجودة داخل التكرار الحلقي for
هي كل شيء موجود هنا.
لذا إنه فقط لنا كقارئين بشريين،
وزملاء التدريس

English: 
in the case of a course, or colleagues
in the case of the real world.
But suppose that you don't quite see
these patterns too readily initially.
That, too, is fine.
CS50 has on its website
what we call a style guide.
It's just a summary of
what your code should
look like when using certain
features of C-- loops,
conditions, variables,
functions, and so forth.
And it's linked on the course's website.
But there's also a tool
that you can use when
writing your code that'll help you
clean it up and make it consistent,
not just for the sake of making it
consistent with the style guide,
but just making your
own code more readable.
So for instance, if I go
ahead and run a command called
style50 on this program,
buggy2.c, and then hit Enter,
I'm going to see some
output that's colorful.
I see my own code in white,
and then I see, anywhere
I should have indented,
green spaces that
are sort of encouraging me to put
space, space, space, space here.
Put space, space, space, space here.
Put eight spaces here, four
spaces here, and so forth,
and then it's reminding me I
should add comments as well.
This is a short program--
doesn't necessarily

Arabic: 
في حالة الدورة التدريبية، أو الزملاء
في حالة العالم الحقيقي.
لكن لنفترض أنك ترى أن هذه
الأنماط عسيرة القراءة في البداية.
هذا، أيضًا، جيد.
لدى CS50 على موقعها على شبكة الإنترنت
ما نسميه دليل الأسلوب.
إنه مجرد ملخص عما يجب أن
تكون عليه التعليمات البرمجية الخاصة بك
عند استخدام ميزات
معينة من C-- التكرار الحلقي،
الشروط، والمتغيرات، والدوال،
وما إلى ذلك.
وهو مرتبط بموقع الدورة الإلكتروني.
لكن هناك أيضًا أداة
يمكنك استخدامها عند
كتابة التعليمات البرمجية التي ستساعدك
في تنظيفها وجعلها متسقة،
ليس فقط من أجل جعلها
تتماشى مع دليل الأسلوب،
ولكن فقط لجعل التعليمات البرمجية الخاصة بك
أكثر قابلية للقراءة.
على سبيل المثال، إذا مضيت قدمًا
وقمت بتشغيل أمر يسمى
style50 على هذا البرنامج،
buggy2.c، ثم ضغطت على Enter،
فسأرى بعض المخرجات
المليئة بالألوان.
أرى التعليمات البرمجية الخاصة بي بالأبيض،
ثم أرى مسافات خضراء، في
الأماكن التي كان يتعين علي وضع
مسافات بادئة فيها، مسافات خضراء
تشجعني نوعًا ما لوضع
مسافة، مسافة، مسافة، مسافة هنا.
ضع مسافة، مسافة، مسافة، مسافة هنا.
ضع ثمانِ مسافات هنا، وأربع
مسافات هنا، وما إلى ذلك،
وهذا يذكرني بأنني
يجب أن أضيف تعليقات إيضًا.
هذا برنامج قصير--
لا يحتاج بالضرورة

Arabic: 
إلى الكثير من التعليقات
لشرح ماذا يحدث.
لكن واحد فقط //، مثل ما
رأيناه الأسبوع الماضي للشرح،
ربما في أعلى الملف
أو أعلى كتلة التعليمات البرمجية،
يمكن أن يجعل style50 سعيدًا أيضًا.
لذا دعونا نفعل ذلك.
دعوني أمضي قدمًا وآخذ نصيحته
وأضع مسافة قبلها باستخدام مفتاح Tab،
هذه باستخدام مفتاح Tab، وهذه باستخدام مفتاح Tab،
وهذه باستخدام مفتاح Tab، ومجددًا مرة أخرى.
وستلاحظ ذلك على لوحة المفاتيح الخاصة بك،
حتى لو كنت تضغط على مفتاح Tab،
إنه في الواقع يحوله لك،
لما هو شائع، أربع مسافات،
حتى لا يجب عليك الضغط على
مفتاح المسافة لأربع مرات.
فقط اعتد على استخدام Tab.
ودعوني أمضي قدمًا
وأكتب تعليقًا هنا.
"اطبع 10 رموز شباك."
بهذه الطريقة، لا يتعين على زملائي،
وزملاء التدريس، وعليّ في أسبوع
قراءة التعليمات البرمجية الخاصة بي مجددًا
واكتشاف ما تفعله.
يمكنني قراءة التعليقات
بمفردي لكل //.
إذا قمت بتشغيل style50 مجددًا،
الآن يبدو جيدًا.
إنها تتفق مع دليل الأسلوب،
و هي مكتوبة بشكل جميل،
إذًا سيصبح مطبوع بشكلٍ جميل
مصطلحًا فنيًا في البرمجة
عندما تبدو التعليمات البرمجية الخاصة بك
جيدة وليست فقط صحيحة.
أية أسئلة أخرى؟
نعم.
الجمهور: حاولت استخدام
[INAUDIBLE] هذا الأسبوع الماضي

English: 
need a lot of commenting
to explain what's going on.
But just one //, like we
saw last week to explain,
maybe at the top of the file
or top the block of the code,
would make style50 happy as well.
So let's do that.
Let me go ahead and take its advice
and actually indent this with Tab,
this with Tab, this with Tab,
this with Tab, and this once more.
And you'll notice that on your keyboard,
even though you're hitting Tab,
it's actually converting it for you,
which is very common to four spaces,
so you don't have to hit
the spacebar four times.
Just get into the habit of using Tab.
And let me go ahead and
write a comment here.
"Print 10 hashes."
This way, my colleagues, my
teaching fellow, myself in a week
don't have to read my own code again
and figure out what it's doing.
I can read the comments
alone per the //.
If I run style50 again,
now it looks good.
It's in accordance with the style guide,
and it's just more prettily written,
so pretty printed would be
a term of art in programming
when your code looks good
and isn't just correct.
Any questions then?
Yeah.
AUDIENCE: I tried using
[INAUDIBLE] this past week

Arabic: 
وقال إنني أحتاج برنامجًا جديدًا.
ديفيد ج. مالان: هذا--
لم يكن ممكّنًا
للأسبوع الأول من الصف الدراسي.
تم تمكينه من الآن فصاعدًا.
أي أسئلة أخرى؟
لا.
حسنًا، إذًا فقط للتخليص، هناك الآن ثلاث
أدوات لتحصل عليها من مجموعة الأدوات
الشهيرة وهي help50 ويستخدم في أي وقت تشاهد
رسالة خطأ لا تفهمها،
سواء كان ذلك مع make أو Clang،
أو ربما، شيء آخر.
Printf-- عندما يكون لديك
برنامج منطقي--
خطأ في البرنامج الخاص بك، حيث
لا يعمل فقط بالطريقة التي يجب أن يعمل بها
أو بالطريقة التي يخبرك بها كيفية
حل المشكلة، ثم style50
عندما تريد التأكد أن، هل تبدو
التعليمات البرمجية الخاصة بي صحيحة من حيث الأسلوب،
وهل يمكن قراءتها قدر الإمكان؟
وبصراحة، ستعثر علينا
في ساعات العمل وسنقوم
غالبًا بتشجيعك، مهلاً،
قبل أن نجيب على هذا السؤال،
هل يمكنك من فضلك تشغيل style50
على التعليمات البرمجية الخاصة بك؟
هل يمكنك تنظيف التعليمات البرمجية الخاصة بك،
لأنها تجعل حياتنا، أيضًا،
كالأشخاص الآخرين أسهل بكثير
عندما نفهم ماذا
يحدث دون الاضطرار إلى
الاكتشاف بصريًا أين تصطف الأقواس
والأقواس المتعرجة.
ولهذا يجب عليكم التمسك
بهذه العادة، لأنها
ستوفر لكم الوقت من إضاعته
في تحليل الأشياء بصريًا بأنفسكم.
حسنًا.

English: 
and it said I needed a new program.
DAVID J. MALAN: That's--
it wasn't enabled for the
first week of the class.
It's enabled as of right
now and henceforth.
Other questions?
No.
All right, so just to recap then, three
tools to have in the proverbial toolbox
now are help50 anytime you see an error
message that you don't understand,
whether it's with make or Clang
or, perhaps, something else.
Printf-- when you've
got a logical program--
a bug in your program, and it's just
not working the way it's supposed to
or the way the problem set tells
you it should, and then style50
when you want to make sure that, does
my code look right in terms of style,
and is it as readable as possible?
And honestly, you'll find us
at office hours and the like
often encouraging you, hey,
before we answer this question,
can you please run style50 on your code?
Can you please clean up your code,
because it just makes our lives, too,
as other humans so much easier
when we can understand what's
going on without having to visually
figure out what parentheses and curly
braces line up.
And so do get into
that habit, because it
will save you time from having to waste
time parsing things visually yourself.
All right.

Arabic: 
لذا لا يوجد فقط وحدات معالجة مركزية في أجهزة الكمبيوتر.
وحدات المعالجة المركزية هي العقول،
وحدة المعالجة المركزية،
ولهذا نظل نؤكد على
التعليمات التي تفهمها أجهزة الكمبيوتر.
وهناك أيضًا هذا، ما
رأيناه المرة الماضية، أيضًا.
وهذا مثال على أي
نوع من الأجهزة؟
الجمهور: رام.
ديفيد ج. مالان: رام، أو ذاكرة الوصول العشوائي.
هذا هو نوع الذاكرة
الذي تحتويه أجهزة الكمبيوتر المحمولة وأجهزة سطح المكتب والخوادم
والذي يستخدم في أي وقت تقوم
بتشغيل برنامج أو فتح ملف.
هناك نوع آخر من الذاكرة يسمى
محركات الأقراص الثابتة أو محركات الأقراص ذات الحالة الصلبة،
والتي ربما تكون على
دراية به كمستهلك،
وهذا هو المكان الذي يتم فيه
تخزين ملفاتك بشكلٍ دائم.
يمكن أن تنتهي بطاريتك.
يمكنك سحب القابس من
الكمبيوتر المحمول أو سطح المكتب،
وتكون أي ملفات محفوظة على
محرك أقراص صلب ثابتة بصورةٍ دائمة.
إنهم يبقون هناك
بسبب التقنية
المستخدمة لتنفيذ ذلك.
لكن ذاكرة الوصول العشوائي سريعة الزوال بصورةٍ أكبر.
يتم تشغيل ذاكرة الوصول العشوائي فقط عن طريق الكهرباء.
يتم استخدامها فقط عند تشغيل الطاقة
أو عندما تكون البطارية مشحونة،
وهي المكان الذي تُخزن فيه ملفاتك
وبرامجك بفعالية عندما
تقوم بالنقر المزدوج عليهم وفتحهم.
لذا عندما تقوم بالنقر المزدوج على
شيء مثل برنامج Microsoft Word،
يتم نسخه من القرص الصلب
ذي المدى الطويل إلى هذا النوع من الذاكرة،

English: 
So there's not just CPUs in computers.
CPUs are the brains,
central processing unit,
and that's why we keep emphasizing the
instructions that computers understand.
There's also this, which
we saw last time, too.
This is an example of
what type of hardware?
AUDIENCE: RAM.
DAVID J. MALAN: RAM, or
Random Access Memory.
This is the type of memory
that laptops, desktops, servers
have that is used whenever you
run a program or open a file.
There's another type of memory called
hard drives or solid state drives,
which you're probably
familiar as a consumer,
and that's just where your
files are stored permanently.
Your battery can die.
You can pull the plug from
your laptop or desktop,
and any files saved on a
hard drive are persistent.
They stay there because
of the technology
being used to implement that.
But RAM is more ephemeral.
RAM is powered only by electricity.
It's only used when the power
is on or the battery is charged,
and it's where your files and
programs live effectively when
you double click on them and open them.
So when you double click on
something like Microsoft Word,
it is copied from your hard drive
long term into this type of memory,

Arabic: 
لأن هذا النوع من الذاكرة،
مع أنه أصغر من حيث السعة--
ليس لديك الكثير من وحدات البايت فيه--
لكنه أسرع بصورةٍ كبيرة جدًا.
بالمثل، عند فتح مستند،
أو الانتقال إلى صفحة ويب،
محتوى الملف الذي تشاهده
يُخزن في هذا النوع من الأجهزة،
لأنه على الرغم من أنك لا تملك
الكثير من وحدات البايت فيه،
لكنه فقط أسرع بصورةٍ كبيرة جدًا.
وهذا سيكون موضوعيًا في
علوم الكمبيوتر وفي الأجهزة.
أنت نوعًا ما لديك الكثير
من الأشياء البطيئة والرخيصة،
مثل مساحة القرص الثابت، من الناحية النسبية،
ولديك أقل قليلاً
من الأشياء الأكثر تكلفة ولكن
أسرع مثل ذاكرة الوصول العشوائي.
ولديك وحدة معالجة مركزية واحدة فقط، عادةً،
وهي الشيء السريع حقًا
والذي يمكنه القيام بمليارات الأشياء في الثانية.
ولكنها أيضا أكثر تكلفة.
ولذا يوجد أربعة رقائق مرئية
على هذا الشيء، إذا صح التعبير.
ولن ندخل في التفاصيل
حول كيفية عمل هذه الأشياء، ولكن دعونا فقط
نقوم بتكبير هذه الرقاقة
السوداء هنا و نركز عليها
كممثله
لبعض المقدار من الذاكرة.
ربما تكون واحد ميغا بايت،
مليون بايت.
ربما حتى واحد جيجا بايت
هذه الأيام، مليار بايت.
ولكن هذا يعني أن هذه الشريحة
يمكن اعتبارها مجرد
مجموعة من وحدات البايت.
هذا ليس معيارًا.

English: 
because this type of memory,
though smaller in capacity--
you don't have as many bytes of it--
but it is much, much, much, much faster.
Similarly, when you open a
document, or you go to a web page,
the contents of the file you're seeing
are stored in this type of hardware,
because even though you don't
have terribly many bytes of it,
it's just much, much, much, much faster.
And so this will be thematic in
computer science and in hardware.
You sort of have lots
of cheap, slow stuff,
like hard disk space, relatively
speaking, and you have a little less
of the more expensive but
faster stuff like RAM.
And you have just one, usually, CPU,
which is the really fast thing that
can do a billion things per second.
But it, too, is more expensive.
So there's four visible chips
on this thing, if you will.
And we won't get into the details
of how these things work, but let's
just zoom in on this one black
chip here and focus on it
as being representative
as some amount of memory.
Maybe it's one megabyte,
one million bytes.
Maybe it's even one gigabyte
these days, one billion bytes.
But this is to say that this chip
can be thought of as just having
a bunch of bytes in it.
This is not to scale.

Arabic: 
لديك الكثير من وحدات البايت
أكثر من هذه، ولكن دعوني
أقترح أن تفكروا فقط
في كل واحد من هذه المربعات
هنا كممثل لبايت واحد.
لذا فالبايت الأول من الذاكرة
الذي يمكنني الوصول إليه هو هنا.
التالي هو هنا، وهكذا.
وحقيقة أنهم يلتفون
هو مجرد تصوير فني.
يمكنك التفكير بهذه الأشياء
افتراضيًا فقط على أنها
تنتقل من اليسار إلى اليمين، وليس في أي نوع من الشبكات،
ولكن ماديًا، يبدو الأمر كذلك.
لذلك عندما تقوم بإنشاء متغير
بالفعل في برنامج مثل C،
فأنت تحتاج إلى char.
يميل char إلى أن يكون
بايت واحد أو 8 وحدات من البت،
وهذا يعني أنه عندما يكون لديك
متغير من نوع char في برنامج بلغة C،
يذهب حرفيًا، بصورة مادية
إلى واحدة من هذه المربعات،
داخل ذاكرة الوصول العشوائي للكمبيوتر الخاص بك.
على سبيل المثال، قد يأخذ
منا كل هذه المسافة في أعلى اليسار.
إذا كان لديك نوع أكبر
من البيانات، مثلاً
لديك عدد صحيح، والذي يميل إلى
أن يكون أربع وحدات بايت أو 32 بت،
قد تحتاج إلى أكثر من مربع،
إذًا قد يمنحك الكمبيوتر إمكانية الوصول إلى
إلى أربعة مربعات بدلاً من ذلك.
ولديك 32 بت تغطي
تلك المنطقة من الذاكرة.
لكن بصراحة، اخترت
تلك المربعات بشكل تعسفي.
كان يمكن أن يكونوا في أي مكان في تلك الشريحة
أو في أي من الشرائح الأخرى.

English: 
You have many more bytes
than these, but let
me propose that you just
think of each of these squares
here as representing one byte.
So the very first byte of
memory I have access to is here.
Next one is here, and so forth.
And the fact that they wrap around
is just an artist rendition.
These things you can think
of just virtually as going
left to right, not in any kind of grid,
but physically, they look like this.
So when you actually create a
variable in a program like C,
like you need a char.
A char tends to be one
byte or eight bits,
and so that means when you have a
variable of type char in a C program,
it goes, literally, physically
in one of these boxes,
inside of your computer's RAM.
So for instance, it might take
up this much space at top left.
If you have a bigger
type of data, so you
have an integer, which tends
to be four bytes or 32 bits,
you might need more than one square,
so the computer might give you access
to four squares instead.
And you have 32 bits spanning
that region of memory.
But honestly, I chose
those boxes arbitrarily.
They could be anywhere in that
chip or in any of the other chips.

Arabic: 
الأمر يعود للكمبيوتر
ليتذكر مكانهم لك.
أنت لست بحاجة لتذكر ذلك، في حد ذاته.
لكن إذا فكرنا في
هذه الشبكة، يتضح أن
هذا في الواقع قيّم جدًا
أن لدينا أجزاء من الذاكرة--
وحدات من البايت، إذا صح التعبير--
متصلين على التوالي مع بعضهم البعض.
في واقع الأمر، هناك
كلمة لهذه التقنية.
وهي الذاكرة المتجاورة--
متصلين على التوالي مع بعضهم البعض.
وبصفة عامة، في البرمجة،
يُشار إلى هذا بمصفوفة.
قد تتذكرون من برنامج Scratch،
إذا كنتم تستخدمون هذه الميزة،
إنها في الواقع لديها أشياء
تسمى قوائم، والتي
هي عبارة بالضبط عن-- قوائم قيم،
قوائم كلمات، قوائم سلاسل.
المصفوفة هي مجرد أجزاء
متجاورة من الذاكرة، حتى
يمكنك تخزين شيء هنا،
شيء هنا، شيء هنا،
شيء هنا، وهكذا.
لذا يتضح أن المصفوفة،
هذا الشيء الأساسي البسيط الرائع
هو في الواقع قوي بشكل لا يصدق.
مجرد القدرة على تخزين
أشياء في ذاكرة الكمبيوتر
متصلين على التوالي مع بعضهم البعض يتيح العديد
من الاحتمالات، كلا التصميمين،
مثل كيف يمكنني كتابة التعليمات البرمجية،
وأيضًا مدى السرعة التي يمكنني بها تشغيل التعليمات البرمجية.
لذلك اسمحوا لي بالمضي قدمًا
وإعطاء مثال على ذلك.

English: 
It's up to the computer to just
remember where they are for you.
You don't need to remember that, per se.
But if we think about
this grid, it turns out
this is actually very valuable
that we have chunks of memory--
bytes, if you will--
that are back to back to back to back.
And in fact, there's a
word for this technique.
This is contiguous memory--
back to back to back to back to back.
And in general, in programming,
this is referred to as an array.
You might recall from Scratch,
if you use this feature,
it actually has things
called lists, which
are exactly that-- lists of values,
lists of words, lists of strings.
An array is just a contiguous
chunk of memory, such
that you can store something here,
something here, something here,
something here, and so forth.
So it turns out an array,
this super simple primitive,
is actually incredibly powerful.
Just being able to store
things in my computer's memory
back to back to back to back enables so
many possibilities, both design-wise,
like how well I can write my code, and
also how fast I can make my code run.
So let me go ahead and
take out an example.

English: 
Let me go ahead and open up, for
instance, a new file in a sandbox,
and we'll call this score0.
So let me go ahead and close this one,
create a new file called scores0.c.
And in this file, let's go ahead and
write a relatively simple program.
Let me go ahead and, as
usual, give myself access
to some helpful functions--
cs50.h and stdio.h.
And no need to copy all this
down verbatim, if you don't like.
Everything will have or is
already on the course's website.
Let me start my program as
usual with int main void.
And then let me write a program,
as this program's name implies,
that, like, asks the user for three
scores on recent problem sets,
quizzes, whatever, and then kind of
creates a very simple chart of them,
like a bar chart to kind of
help me visualize how well
or how poorly I did on something.
So if I want to get an
integer, no surprise,
we can use the get int
function, and I can just
ask the user for their first score.
But I should probably do
something with this score,

Arabic: 
اسمحوا لي بالمضي قدمًا وفتح، على سبيل
المثال، ملف جديد في sandbox،
وسنطلق عليه score0.
لذلك اسمحوا لي بالمضي قدما وإغلاق هذا،
وإنشاء ملف جديد يُسمى scores0.c.
وفي هذا الملف، دعونا نمضي قدمًا
ونكتب برنامجًا بسيطًا نسبيًا.
اسمحوا لي بالمضي قدمًا،
كالمعتاد، وإعطاء نفسي إمكانية وصول
إلى بعض الدوال المفيدة--
cs50.h وstdio.h.
وليس هناك حاجة لنسخ كل هذا
في الأسفل حرفيًا، إذا كنت لا تحب ذلك.
كل شيءٍ
بالفعل على الموقع الإلكتروني للدورة.
دعوني أبدأ برنامجي كالعادة
مع int main void.
ثم اسمحوا لي بكتابة برنامج،
كما يشير اسم هذا البرنامج،
مثل، أن يطلب من المستخدم ثلاث
درجات على مجموعات المشكلة الأخيرة،
أو مسابقات، أيًا كان، ثم نوعًا ما
يُنشيء مخططًا بسيطًا جدًا منهم،
مخطط شريطي مثلاً
ليساعدني على تصور مدى جودة
أو رداءة أدائي في شيءٍ ما.
إذا كنت أرغب في الحصول على
عدد صحيح، لا مفاجأة،
يمكننا استخدام دالة int،
ويمكنني فقط
أن أطلب من المستخدم الحصول على أول درجة له.
ولكن ربما يجب أن أفعل
شيئًا بهذه النتيجة،

Arabic: 
وعلى الجانب الأيسر من هذا،
ما الذي أضعه عادةً؟
نعم.
إذًا int--بالتأكيد، النتيجة 1 تساوي
هذا، ثم الفاصلة المنقوطة.
قد لا يكون لديكم العديد من
المناسبات لاستخدام ints فقط حتى الآن،
لكن get int موجود في مكتبة cs50.
هذا هو ما يسمى
المُحث الذي يراه الشخص
واسمحوا لي في الواقع
بإصلاح المسافة الخاصة بي، لأنني
أريد أن يرى الشخص المسافة
بعد النقطتين.
لكن هذا مجرد تفصيل جمالي.
ثم عندما أعيد إلى هذه القيمة،
قيمة إرجاعها--
تماما مثلما، في الأسبوع الماضي،
سلمني آرون قطعة من الورق،
فـ get int أيضًا سلمني قطعة
افتراضية من الورق وفيها رقم
والتي سأخزنها في
متغير يُسمى Score 1.
والآن فقط لنكون واضحين، ما
حدث فعليًا هو هذا.
في اللحظة التي تقوم فيها بإنشاء متغير
من نوع int، وهو أربع وحدات بايت،
حرفيًا، هذا هو ما يفعله
Clang أو، بشكل عام،
الكمبيوتر من أجلك.
يتم تخزين int الذي
كتبه الإنسان حرفيًا
في أربع وحدات بايت متجاورة متصلة على التوالي،
ربما هنا، ربما هنا،
لكن معًا.
هذا كل ما يحدث
عندما في الواقع تستخدم لغة C.
لذلك اسمحوا لي بالعودة إلى
التعليمات البرمجية الخاصة بي هنا، وأنا الآن

English: 
and on the left hand side of
this, what do I typically put?
Yeah.
So int-- sure, score 1 equals
this, and then my semi-colon.
So you might not have had many
occasions to use ints just yet,
but get int is in the cs50 library.
This is the so-called
prompt that the human
sees, and let me actually
fix my space, because I
want the human to see the
space after the colon.
But that's just an aesthetic detail.
And then when I get back this
value, its return value--
just like Aaron, last week,
handed me a piece of paper,
so does get int hand me a virtual
piece of paper with a number
that I'm going to store in
a variable called Score 1.
And now just to be clear, what has
just happened effectively is this.
The moment you create a variable
of type int, which is four bytes,
literally, this is what
Clang or, more generally,
the computer has done for you.
That int that the human
typed in is stored literally
in four contiguous bytes back to
back to back, maybe here, maybe here,
but together.
So that's all that's going on
when you're actually using C.
So let me go back into
my code here, and now I

Arabic: 
أريد أن-- ليس من المثير
كتابة درجة واحدة.
لذا دعوني أمضي قُدمًا وأكتب واحدة أخرى.
إذًا int Score 2، get int، get int،
وسأطلب من المستخدم score 2،
فاصلة منقوطة، ثم دعونا نحصل على واحدة
أخرى Score 3، get int، ثم نسميها Score 3،
فاصلة منقوطة.
حسنًا، اسمحوا لي الآن بالمضي
قدمًا والقيام بتوليد شريط،
مثل المخطط الشريطي لهذا.
سأستخدم ما
سندعوه فن ASCII.
ASCII، بالطبع، هو مجرد نص، تذكروا--
نص بسيط جدًا في الكمبيوتر.
ويمكنني أن أقوم بتصميم مخطط شريطي
بسيط جدًا فقط عن طريق طباعة
مجموعة من رموز الشباك مثلاً
أفقيًا، لذلك سيمثل الشريط القصير
رقمًا صغيرًا، وسيمثل
الشريط الطويل رقمًا كبيرًا.
لذا دعوني أمضي قدمًا وأقول
للمستخدم، حسنًا، ها هو Score 1 الخاص بك.
سأمضي قدمًا، ثم،
أقول، for int i get 0.
I أقل من Score 1, i++.
والآن إذا قمت بالتمرير لأسفل
وأعطيت نفسي مساحة هنا،
دعوني أمضي قدمًا وأنفذ
فقط طباعةٍ بسيطة.
امضِ قدمًا واطبع رمز شباك،
ثم عندما تنتهي من هذا،

English: 
want to-- it's not
interesting to plot one score.
So let's go ahead and do another.
So int Score 2, get int, get int,
and I'll ask the user for score 2,
semi-colon, and then let's get one
more, Score 3, get int, call it Score 3,
semi-colon.
All right, so now let me go
ahead and generate a bar,
like a bar chart of this.
I'm going to use what
we'll call ASCII art.
ASCII, of course, is just text, recall--
very simple text in a computer.
And I can kind of make a bar chart
pretty simply by just printing out
like a bunch of hashes
horizontally, so a short bar
will represent a small number, and a
long bar will represent a big number.
So let me go ahead and say to the
user, all right, here's your Score 1.
I'm going to go ahead, then,
and say, for int i get 0.
I is less than Score 1, i++.
And now if I scroll down and
give myself a bit of room here,
let me go ahead and implement
just a simple print.
So go ahead and print out a hash, and
then when you're all done with that,

English: 
print out a new line at
the end of that loop.
And let's just pause there.
Just to recap, I've asked
the human for three scores.
I'm only doing something with one
of them at the moment, so in fact,
just as a quick check, let me delete
those so as to not get ahead of myself.
Let me do make score 0.
Cross my fingers.
OK, no errors.
Now let me go ahead and do ./score0,
and your first score on a pset this year
out of 100 has been?
OK, 100.
And good job.
So it's a really long bar,
and if we count those up,
hopefully, there's actually 100 bars.
And if we run it again and
say, eh, it didn't go so well.
I got a 50.
That's half as big a bar.
So it seems like we're on
our way correctness-wise.
So now let me go ahead
and get the other scores.
Well, I had them here a moment ago.
So let me go ahead and just, well,
copy, paste, and change this to two,
change this to three, change
this to three, this to three.
All right, I know how to print
bars clearly, so let me go ahead
and do this, and then do this,
and then fix the indentation.
I don't want to say Score 1 everywhere.

Arabic: 
اطبع سطرًا جديدًا
في نهاية التكرار الحلقي هذا.
دعونا فقط نتوقف لثانية هنا.
فقط للتلخيص، لقد
سألت الأشخاص عن ثلاث نتائج.
أنا أفعل شيئًا ما مع واحد منهم فقط
في الوقت الحالي، لذلك في الواقع،
فقط كفحص سريع، دعوني أحذف
هؤلاء لكي لا أمضي قدمًا بنفسي.
دعوني أقوم make score 0.
سأعقد أصابعي.
حسنًا، لا أخطاء.
الآن اسمحوا لي بالمضي قدمًا وكتابة ./score0،
وماذا كانت نتيجتك الأولى في pset
هذا العام من أصل 100؟
حسنًا، 100.
وعمل جيد.
إنه حقًا شريطٌ طويل،
وإذا قمنا بعد هؤلاء،
نأمل، أن يكون هناك في الواقع 100 شريط.
وإذا قمنا بتشغيله مجددًا
والقول، إيه، هذا لم يجرِ يصورةٍ جيدة.
حصلت على 50.
هذا نصف حجم الشريط.
لذلك يبدو أننا في طريقنا الصحيح
لطريقة التشغيل.
والآن دعوني أمضي قدمًا
وأحصل على الدرجات الأخرى.
حسنًا، حصلت عليهم هنا منذ لحظة.
لذا دعوني أمضي قدمًا وحسنًا فقط، أنسخ،
وألصق، وأغير هذا إلى اثنين،
وأغير هذا إلى ثلاثة، وأغير
هذا إلى ثلاثة، هذا إلى ثلاثة.
حسنًا، أعرف كيفية طباعة
شريط بطريقة واضحة، لذا دعوني أمضي قدمًا
وأقوم بذلك، ومن ثم أقوم بذلك،
ثم إصلاح المسافة البادئة.
لا أريد أن أقول Score 1 في كل مكان.

English: 
I want to say a Score 2, Score 2.
I mean you're probably being
rubbed the wrong way that this
is both tedious and sloppy, and why?
What am I doing poorly now design-wise?
AUDIENCE: Copying and pasting code.
DAVID J. MALAN: Like copy-pasting
almost always bad, right?
There's redundancy
here, but that's fine.
Let's prioritize correctness,
at least, for now.
So let me go ahead and make Score 0.
All right, no mistakes-- ./score0.
And then Tab it.
Let me go ahead now and run--
OK, we got 100 the first time.
We got 50 the--
oh, that's a bug.
What did I do there?
See, this is what happens
when you copy-paste.
So let's fix this.
That should say Score 2, so
Control+C will quit a program.
Make score 0 will
recreate it. ./0, Enter--
all right, here we go.
100, 50.
Let's split the difference--
75.
All right, so this is a simple
bar chart horizontally drawn
of each of my three scores, where this
is 100, this is 50, and this is 75.
But there's opportunities
for improvement here.
So one, it rubbed some
folks the wrong way

Arabic: 
أريد أن Score 2, Score 2.
أعني أنك ربما كنت مُضللاً
بطريقة خاطئة أن هذا
أمرًا سيئًا ومملاً، ولماذا؟
ما الذي أفعله بشكل سيئ الآن من حيث التصميم؟
الجمهور: نسخ التعليمات البرمجية ولصقها.
ديفيد ج. مالان: النسخ واللصق
معظم الوقت أمر سيئ، أليس كذلك؟
يوجد تكرار هنا،
لكن لا بأس.
دعونا نعطي الأولوية للتصحيح،
في الوقت الحالي، على الأقل.
إذًا دعوني أمضي قدمًا وأنشيء Score 0.
حسنًا، لا أخطاء-- ./score0.
ثم النقر عليها.
دعوني أمضي قُدمًا وأشغل--
حسنًا، لقد حصلنا على 100 في المرة الأولى.
وحصلنا على 50 فى--
أوه، هذا خطأ.
ما الذي فعلته هناك؟
انظروا، هذا ما يحدث عندما
تقومون بالنسخ واللصق.
إذًا دعونا نصلح هذا.
ينبغي أن يكون هذا Score 2،
إذًا Control+C سينهي البرنامج.
سيقوم Make score 0 بإعادة
إنشائه. ./0، Enter--
حسنًا، ها قد بدأنا.
100، 50.
دعونا نقسم التباعد--
75.
حسنًا، لذلك هذا مخطط شريطي
بسيط مرسوم أفقيًا
لكل واحدة من النقاط الثلاث الخاصة بي، حيث أن هذا
هو 100، وهذا 50، وهذا 75.
لكن هناك فرص
للتحسين هنا.
إذًا أولاً، إنها تضلل
بعض الناس

Arabic: 
بالفعل حيث كنا حرفيًا
ننسخ التعليمات البرمجية ونلصقها.
فأين هى الفرصة
الوحيدة للتحسين هنا؟
ما الذي ينبغي عليّ فعله بدلاً من نسخ
التعليمات البرمجية ولصقها مراراً وتكراراً؟
ما المقوم الذي يمكنكم وضعه؟
حسنًا، إذًا يمكننا استخدام التكرار الحلقي وفي الواقع
فعل الشيء نفسه ثلاث مرات.
إذًا دعونا نجرب ذلك.
دعوني أمضي قُدمًا وأقوم بذلك.
إذًا دعوني أمضي قدمًا
وأحذف النسخ واللصق الذي قمت به،
ودعوني أمضي قدمًا وأقول، حسنًا،
for int i get zero, i less than 3, i++.
دعوني أنشيء قوسًا.
يمكنني تمييز عدة
سطور والنقر فوق Tab،
وستتم إزاحتهم جمعيًا،
وهو أمر مناسب.
هل يمكنني القيام بذلك الآن، مثلاً؟
قولها بصوتٍ أعلى قليلاً.
الجمهور: إذا كنت [INAUDIBLE]
إلى محددة [INAUDIBLE]..
ديفيد ج. مالان: نعم،
أنا قلق قليلاً.

English: 
already that we were literally
copying and pasting code.
So where is one opportunity
for improvement here?
What should I do instead of copying
and pasting that code again and again?
What ingredient can you bring?
OK, so we can use a loop and actually
just do the same thing three times.
So let's try that.
Let me go ahead and do this.
So let's go ahead and
delete the copy-paste I did,
and let me go ahead and say, OK, well,
for int i get zero, i less than 3, i++.
Let me create a bracket.
I can highlight multiple
lines and hit Tab,
and they'll all indent for
me, which is convenient.
And can I do this now, for instance?
Say it a little louder.
AUDIENCE: If you [INAUDIBLE]
to a specific [INAUDIBLE]..
DAVID J. MALAN: Yeah,
I'm a little worried.

English: 
As you're noting here, we're using on
line 13 here the same variable, so mm.
So it's good instincts,
but I feel like the fact
that this program,
unlike last week, we're
now collecting multiple pieces of data.
Loops are breaking down for us.
Yeah.
AUDIENCE: [INAUDIBLE] function
[INAUDIBLE] takes in--
like you can have it [INAUDIBLE].
DAVID J. MALAN: OK.
AUDIENCE: So like an input of how
many scores you wanted to enter.
DAVID J. MALAN: OK.
AUDIENCE: And then [INAUDIBLE].
DAVID J. MALAN: Yeah,
we can implement another
function that factors out
some of this functionality.
Any other thoughts?
AUDIENCE: Store your scores in an array.
DAVID J. MALAN: OK, so we could
also store our scores in an array.
So let's do these in
order then, in fact.
So loops are wonderful when you
want to do something again and again
and again, but the whole
purpose of a function,
fundamentally, is to factor
out common functionality.
And there might still be
a loop in the solution,
but the real fundamental problem
with what I was doing a moment ago
was I was copying and
pasting functionality--
shouldn't need to do that,
because in both C and Scratch,
we had the ability to
make our own functions.
So let's do that.
Let me undo my loop changes
here, just to get us
back to where we were a moment ago.

Arabic: 
كما تلاحظون هنا، إننا نستخدم في
السطر 13 هنا المتغير نفسه، إذًا امم.
حدس جيد،
لكني أشعر فى الواقع
أن هذا البرنامج،
مغاير لسابقه فى الأسبوع الماضي، ونحن
الآن نجمع عدة أجزاء من البيانات.
التي يقسمها لنا التكرار الحلقي.
نعم.
الجمهور: يأخذ [INAUDIBLE] دالة
[INAUDIBLE] تؤخذ فى--
كما لو يمكنك الحصول عليه [INAUDIBLE].
ديفيد ج. مالان: حسنًا.
الجمهور: مثل مُدخلٍ لِكم
عدد النتائج التي أردت إدخالها.
ديفيد ج. مالان: حسنًا.
الجمهور: وإذًا، [INAUDIBLE].
ديفيد ج. مالان: نعم، يمكننا تنفيذ
دالة أخرى تقلل بعضًا
من تلك الوظيفة.
أي أفكار أخرى؟
AUDIENCE: قم بتخزين نتائجك في مصفوفة.
ديفيد ج. مالان: حسنًا، يمكننا
أيضًا تخزين نتائجنا فى مصفوفة.
إذًا دعونا نفعل هذا
بترتيب، في الواقع.
إذًا التكرارت الحلقية رائعة عندما تريد
أن تفعل شيئًا مرارًا
وتكرارًا، ولكن الغرض كله من دالة ما،
في جوهر الأمر، هو لتعيين
أداء وظيفي مشترك.
وربما ما يزال هناك
تكرار حلقي فى الحل،
لكن المشكلة الجوهرية الحقيقية
مع ما كنت أفعله منذ لحظة
هي أنني كنت أقوم بنسخ
ولصق الأداء الوظيفي--
لا يتعين علينا القيام بهذا، لأن
في كل من C و سكراتش،
كان بوسعنا
إنشاء الدالات الخاصة بنا.
إذًا دعونا نقوم بذلك.
دعوني ألغي تغييرات التكرار الحلقي
هنا، فقط للعودة
إلى ما كنا عليه منذ لحظات.

Arabic: 
دعوني أمضي قدمًا، وبدلاً من ذلك،
إزالة هذا قليلا.
دعوني أمضي قدمًا
وأُنشيء دالة جديدة
في الأسفل هنا سأسميها
مثلاً، Chart، فقط
فقط لأنشىء مخططًا لنفسي.
وانها ستحصل على نتيجة لكونها مُدخل،
ولكن يمكنني أن أسميه ما أريد.
إنها void كونها علامة رجوع، لأنني
لا أريدها أن تسلمني شيئًا
مجددًا.
لن أحصل على سلسلة
من المستخدم.
قمت فقط بطباعة حرف.
إنه ما يسمى التأثير الجانبي أو المخرج.
الآن سأمضي قدمًا وسأقوم بالتكرار الحلقي لديّ
هنا for int i get 0.
I أقل من--
كم عدد علامات الشباك التي أريد طباعتها في حالة
تمريري في نتيجة المستخدم؟
مثلاً، هل هذا 3 هنا؟
الجمهور: النتيجة.
ديفيد ج. مالان: النتيجة،
إذًا لو تم
تسليمي رقمًا يتراوح من 0 إلى 100،
وهذا ما أريد تكراره دومًا.
إذا كان هدفي هنا، في النهاية--
دعوني أنهي هذه المُعضِلة-- i++ هى
[؟ 2 ؟] داخل هذا التكرار الحلقي
اطبع علامة شباك واحدة لكل
نقطة فى إجمالي نتائج 1.
وفقط للحفاظ على الأشياء نظيفة،
سأمضي قدمًا وأضع
سطرًا جديدًا في أقصي نهاية هذا.
لكنني أعتقد الآن، أنني قمت بتقليل
كمية لا بأس بها من التكرار.

English: 
And let me go ahead and, instead,
clean this up a little bit.
Let me go ahead and
create a new function
down here that I'm going
to call, say, Chart, just
to create a chart for myself.
And it's going to take as input a score,
but I could call this anything I want.
It's void as its return type, because
I don't need it to hand me something
back.
Like I'm not getting a
string from the user.
I'm just printing a char.
It's a so-called side effect or output.
Now I'm going to go ahead and
do my loop here for int i get 0.
I is less than--
how many hashes do I want to print if
I'm being passed in the user score?
Like, is this 3 here?
AUDIENCE: The score.
DAVID J. MALAN: The
score, so if I'm being
handed a number that's 0 to 100,
that's what I want to iterate over.
If my goal here, ultimately--
let me finish this thought-- i++ is
[? 2 ?] inside this loop print out one
hash per point in 1's total score.
And just to keep things clean,
I'm going to go ahead and put
a new line at the very end of this.
But I think now, I factored out
a good amount of the redundancy.

Arabic: 
ليس جميعه،
ولكني على الأقل الآن
منحت نفسي دالة تسمى Chart.
إذًا فى الأعلى هنا، يبدو أنه يمكنني
نوعًا ما إزالة ذلك التكرار الحلقي، الذي
قمت بتقليله.
إنه متطابق تقريبًا، باستثناء أن
اسم المتغير كان مُرّمزًا ضمنيًا.
وأعتقد أنه يمكنني
الآن إنشاء مخطط مثل هذا،
ثم ربما يمكنني القيام بالنسخ واللصق
قليلاً، لو كان ممكنًا، إذا
يمكنني البعد عن طريق القيام بذلك،
ثم مثلاًُ 2، ثم مثلاً 3،
ثم لنقل 3، ثم لنقل 2.
إنه لا يزال يقوم بالنسخ
واللصق، لكن بشكل أقل.
ويبدو أفضل.
إنه حرفيًا يناسب الموجود على الشاشة،
لذا إنه تقدم-- ليس مثاليًا، لكنه تقدم.
تصميم أفضل، لكنه
ليس مثاليًا.
إذًا هل سيتحول هذا برمجيًا؟
سأواجه أخطاء، لماذا؟
الجمهور: بشكل أساسي، إنه [INAUDIBLE]
البرنامج[INAUDIBLE]..
ديفيد ج. مالان: حسنًا.
أجل.
الجمهور: نحن بحاجة
إلى إعلان [INAUDIBLE]..
ديفيد ج. مالان: حسنًا، جيد.
اسمحوا لي أن أحث الخطأ الفعلي،
فقط حتى نعرف المشكلة التي نقوم بحلها.

English: 
It's not everything,
but I've at least now
given myself a function called Chart.
So up here, it looks like I can
kind of remove this loop, which
is what I factored out.
That's almost identical, except
the variable name was hardcoded.
And I think I could
now do chart like this,
and then I maybe could do a little
copy-paste, if that's OK, like if maybe
I can get away with just doing this,
and then say 2, and then say 3,
and then say 3, and then say 2.
So it's still copy-paste, but it's less.
And it looks better.
It literally fits on the screen, so it's
progress-- not perfect, but progress.
Better design, but not perfect.
So is this going to compile?
I'm going to have errors why?
AUDIENCE: Essentially, it's
[INAUDIBLE] the program [INAUDIBLE]..
DAVID J. MALAN: OK.
Yeah.
AUDIENCE: We need to
declare a [INAUDIBLE]..
DAVID J. MALAN: OK, good.
So let me induce the actual error, just
so we know what problem we're solving.

English: 
Let me go ahead and sort
of innocently go ahead
and compile Score 0 hoping
all is well, but of course,
it's not because of a
familiar error up here.
So notice, implicit declaration of
function chart is invalid in C99.
So again, implicit
declaration of function
just tends to mean Clang does not
know what you're talking about.
And you could run help50,
and it would probably
provide you with similar advice.
But the gist of this is that
chart is not a C function.
It doesn't come with C. I wrote it.
I just wrote it a little too late.
So one solution that we
didn't used last week
would be, OK, well, if you don't
know what chart is, let me just
go put it where you'll know about it.
And now run make score 0.
OK, problem solved.
So that fixes it, but we fixed
it in a different way last week.
And why might we want to stick
with last week's approach
and not just copy-paste
my function and put it
at the top instead of the bottom?
AUDIENCE: [INAUDIBLE].

Arabic: 
اسمحوا لي بالمضي قدمًا وأن
أمضي قدمًا نوعًا ما ببراءة
وأقوم بتحويل Score 0 برمجيًا على
أمل أن كل شيء على ما يرام، لكن بالطبع،
ليس بسبب خطأ شائع هنا.
لذا لاحظوا، التصريح الضمني
لمخطط الدالة غير صالح في C99.
لذا مرة أخرى،
التصريح الضمني للدالة
فقط قد يعني أن Clang
لا يعرف ما الذي تتحدث عنه.
ويمكنك تشغيل help50،
وربما على الأرجح
سيعطيك نصيحة مماثلة.
لكن مضمون هذا هو أن
المخطط ليس دالة C.
إنه لا يأتي مع لغة C. أنا من كتبته.
لقد كتبته منذ قليل.
إذًا فإن الحل الذي لم
نستخدمه الأسبوع الماضي
سيكون، حسنًا، إذا لم تعرفوا
ما هو المخطط، فاسمحوا لي فقط
أن أذهب وأضعه حيث ستعرفونه.
والآن قم بتشغيل make score 0.
حسنًا، تم حل المشكلة.
إذًا هذا يصلحها، لكننا قد أصلحناها
بطريقة مختلفة الأسبوع الماضي.
ولماذا قد نرغب في التمسك
بنهج الأسبوع الماضي
وليس مجرد نسخ الدالة
ولصقها ووضعها
في الأعلى بدلاً من الأسفل؟
الجمهور: [INAUDIBLE].

Arabic: 
ديفيد ج. مالان: أجل، أنا أقصد أنه يمثل
قلقًا طفيفًا نوعًا ما في هذه اللحظة،
لأن هذا برنامج قصير جدًا.
ولكني أقوم بدفع الجزء الرئيسي
من برنامجي، حرفيًا يدعى Main،
أبعد وأبعد باتجاه الأسفل.
والمغزى من قراءة التعليمة البرمجية
هو فهم ماذا تفعل.
لذا إذا قمت بفتح هذا الملف، وتعين علي
التمرير، والتمرير، والتمرير، والتمرير، والتمرير
فقط للبحث عن الدالة الرئيسية،
فإن هذا أسلوب سيء.
إنه لطيف نوعًا ما،
وهو تقليد بشري جيد.
ضع التعليمة البرمجية الرئيسية، الدالة الرئيسية،
مكافئ النقر على العلم الأخضر،
في الأعلى.
إذًا لغة C تقدم لنا حلاً هنا.
يجب عليك فقط أن تزوده
بتلميح صغير.
اسمحوا لي بالمضي قدمًا وقص هذا من هنا،
ووضعه ثانيةً في الأسفل هنا،
ومن ثم المضي قدمًا والنسخ واللصق
فقط أو إعادة كتابة القيمة فقط--
عذرًا--القيمة لهذا السطر الأول،
والتي تسمى بالنموذج الأولي.
أعطي Clang معلومات كافية بحيث
يعرف الوسائط التي تأخذها الدالة
ونوع الإرجاع الخاص بها،
وما هو اسمها، فاصلة منقوطة،
وهذا هو ما يسمى
بالإعلان أو--
ومن ثم تنفيذها بالأقواس
المتعرجة وكل المنطق أدناه.
لذا دعونا نمضي قدمًا ونشغل هذا.

English: 
DAVID J. MALAN: Yeah, I mean it's
kind of a minor concern at the moment,
because this is a pretty short program.
But I'm pushing the main part of
my program, literally called Main,
farther and farther down.
And the whole point of reading code
is to understand what it's doing.
So if I open this file, and I have to
scroll, scroll, scroll, scroll, scroll,
just looking for the main
function, it's just bad style.
It's just kind of nice, and
it's a good human convention.
Put the main code, the main function,
when green flag clicks equivalent,
at the very top.
So C does offer us a solution here.
You just have to provide
it with a little hint.
Let me go ahead and cut this from here,
put it back down at the bottom here,
and then go ahead and copy-paste
only or retype only the value--
whoops-- the value of that first line,
which is its so-called prototype.
Give Clang enough information so that
it knows what arguments the function
takes, what its return type is,
and what its name is, semi-colon,
and that's the so-called
declaration or--
and then implement it with the curly
braces and all the logic down below.
So let's go ahead and run this.

English: 
And if I scroll up here,
we'll see-- whoops.
We'll see make score 0.
All right, now we're
on our way, score 0.
Enter.
Score 1 is 100, 50, 75, and now we
seem to have some good functionality.
But there's still an opportunity,
I dare say, for improvement.
And I think the fundamental
problem is that I'm still
copy-pasting the little
stuff, but I think
the fundamental problem is that I
don't have the expressiveness to store
multiple values, unless I, in
advance, as the programmer,
give them all unique names, because if
I use the same variable for everything,
I couldn't collect all
three variables at the top,
and then iterate over all three at the
bottom, if I only have one variable.
So I do need three variables,
but this doesn't scale very well.
And who knows?
If I want to take in five scores,
10 scores, or more scores,
then I'm really copying
and pasting excessively.
So it turns out, indeed,
the answer is an array.
So an array, at the
end of the day, is just
a side effect of storing stuff in
memory back to back to back to back.

Arabic: 
وإذا مررت لأعلى هنا،
سنرى-- عذرًا.
سنرى make score 0.
حسنًا، نحن الآن في طريقنا
إلى، score 0.
Enter.
Score 1 هو 100، 50، 75، والآن
يبدو أننا لدينا دالة جيدة.
ولكن لا يزال هناك فرصة،
أجرؤ على القول، للتحسين.
وأعتقد أن المشكلة الأساسية
هي أنني ما زلت
أقوم بنسخ ولصق الأشياء
الصغيرة، لكن أعتقد
أن المشكلة الأساسية هي أنني
لا يوجد لدي التعبيرات المنطقية لتخزين
قيم متعددة، إلا إذا كنت
مسبقًا، كمبرمج،
أعطيتهم جميع الأسماء الفريدة، لأنه إذا استخدمت
المتغير نفسه لكل شيء،
لن أتمكن من جمع
الثلاث متغيرات في الأعلى،
ثم تتكرر على كل ثلاثة في
الأسفل، إذا كان لدي متغير واحد فقط.
لذلك أحتاج إلى ثلاثة متغيرات،
لكن هذا لا يُقاس بشكلٍ جيد.
ومن يعلم؟
إذا أردت أن آخذ خمس نتائج،
أو 10 نتائج، أو نتائج أكثر،
فأنا حقًا أقوم بالنسخ
واللصق بشكلٍ مفرط.
لذا يتضح، بالفعل،
أن الإجابة هي مصفوفة.
لذا المصفوفة، في
نهاية الأمر، هي مجرد
تأثير جانبي لتخزين الأشياء في
الذاكرة متصلين على التوالي مع بعضهم البعض.

English: 
But what's powerful about this
reality of memory is the following.
I can go ahead here and in,
say, a new and more improved
version of this program, do this.
Let me go ahead and open this one, which
I wrote in advance, called scores2.c.
And in scores2.c, notice
we have the following code.
In my main function, I've got a new
feature and a new bit of syntax.
This line here that I've
highlighted says, hey, Clang,
give me a variable called
Scores of type integer,
but please give me three of them.
So the new syntax are
your square brackets,
and inside of which is the number
of variables you want of that type.
And you don't have to
give them unique names.
You literally call them
collectively, Scores,
and in English, I deliberately
chose a plural to connote as much.
This is an array of
values, not a single value.
What can I do next?
Well, here's my for loop for int
i get zero i is less than 3 i++,
and now I've solved that earlier
problem that was proposed.
Well, just put it in a loop.

Arabic: 
ولكن ما هو قوي حول
حقيقة الذاكرة هذه هو التالي.
أستطيع المضي قدمًا وفي،
لنقل، إصدار جديد وأكثر تحسينًا
من هذا البرنامج، والقيام بهذا.
دعوني أمضي قدمًا وأفتح هذا، والذي
كتبته مسبقًا، ويُسمى scores2.c.
وفي scores2.c, لاحظوا
أن لدينا التعليمات البرمجية التالية.
في الدالة الرئيسية، لدي ميزة
جديدة ووحدة بت جديدة من الصيغ.
هذا السطر هنا الذي
ظللته يقول، مرحبًا، Clang،
أعطني متغيرًا يُدعى
Scores من نوع العدد الصحيح،
لكن من فضلك أعطني ثلاثةً منهم.
لذا فإن الصيغة الجديدة هي
القوسان المربعان لديك،
وداخلهما أرقام المتغيرات
التي تريدها من هذا النوع.
ولا يجب عليك أن
تمنحهم أسماء فريدة من نوعها.
أنت تدعوهم حرفيًا
بصورة جماعية، Scores،
وباللغة الإنجليزية، اخترت عمدًا
صيغة الجمع للتعبير عن ذلك.
هذه مصفوفة
قيم، وليست قيمة مفردة.
ما الذي يمكنني فعله بعد ذلك؟
حسنًا، ها هو التكرار الحلقي for loop for int
i get zero i أقل من 3 i++،
والآن قمت بحل هذه المشكلة
السابقة التي تم اقتراحها.
حسنًا، فقط ضعه في تكرارٍ حلقي.

English: 
Now I can, because now my variables are
not called Score 1, Score 2, Score 3,
which I literally had to hard code.
They're just called Scores, and
now that they're called Scores,
and I have this square bracket
notation, notice what I can do.
I can get an int, and I can say, give
me score%i, and plug in i plus 1.
I didn't want to say
"zero," because humans
don't count from zero in general.
So this is counting from one, two, and
three, but the computer is doing this.
So Scores is a variable.
Bracket, i, close bracket says
store the i-th value there.
So i-th is just non-English.
That means go to bracket
0, bracket 1, bracket 2.
So what this effectively means is on
the first iteration of the loop, when
i equals 0, this looks
like this, effectively.
When i then becomes 1 on the next
iteration, then you're doing this.
When i becomes 2 on the final
iteration, it looks like this.
When i becomes 3, well,
3 is not less than 3,
and so it doesn't execute again.

Arabic: 
أستطيع الآن، لأن المتغيرات الخاصة بي
لا تُسمى Score 1, Score 2, Score 3،
والتي حولتها إلى تعليمات برمجية ثابت.
هم فقط يسمون Scores،
والآن بما أنهم يُطلق عليهم Scores،
ولدي هذا الترقيم
للأقواس المربعة، فلاحظوا ما يمكنني القيام به.
يمكنني الحصول على int, ويمكنني القول أن،
اعطني score%i، وأدخل i زائد 1.
لم أكن أريد أن أقول
"صفر"، لأن الأشخاص
لا يعدون من الصفر في العموم.
لذا هذا يعد من واحد، اثنين، ثلاثة،
لكن الكمبيوتر يقوم بهذا.
لذا فإن Scores يعد متغيرًا.
قوس، i، إغلاق القوس يقول
خزّن قيمة i-th هناك.
لذا i-th ليست لغة إنجليزية.
وهذا يعني الانتقال إلى القوس
0، والقوس 1، والقوس 2.
إذًا ما يعنيه هذا بشكلٍ فعال هو
أن التكرار الأول للتكرار الحلقي، عندما
i يساوي صفرًا، هذا يبدو
مشابهًا لهذا، بشكلٍ فعّال.
عندما يصبح i واحدًا في التكرار
التالي، إذًا قم بهذا.
عندما يصبح i اثنين في التكرار
النهائي، فهي تبدو مثل هذا.
عندما يصبح i ثلاثة، حسنًا،
3 ليس أقل من 3،
وبالتالي لا يتم تنفيذه مجددًا.

Arabic: 
لذا باستخدام i داخل هذه الأقواس
المربعة، هل أقوم بفهرسة المصفوفة؟
الفهرسة إلى مصفوفة تعني
الانتقال إلى موقع معين،
الموقع المُسمى i-th،
لكنك تبدأ العد من الصفر.
فقط لجعل هذا أكثر
واقعية، ثم، إذا ذهبت للخلف
لهذه الصورة
لذاكرة جهاز الكمبيوتر الخاص بك،
لذلك، هذا ربما،
يكون القوس i، القوس 1--
القوس 0، القوس 1، القوس 2، القوس
3، القوس 4، القوس 50، أو أيًا كان.
يمكنك الآن، باستخدام الأقواس المربعة، الدخول إلى
أيٍ من كتل الذاكرة هذه
لتخزين القيم لك.
أي أسئلة حول ما قمنا به للتو؟
حسنًا، ثم على الجانب الآخر،
يمكننا القيام بالشيء نفسه بالضبط.
الآن عندما أطبع نتائجي، يمكنني
التكرار بالمثل من 0 إلى 3،
ثم طباعة النتائج
عن طريق التمرير إلى المخطط
القيمة نفسها، نتيجة i-th.
مجددًا، الصيغة الجديدة الوحيدة هنا
هي اسم متغير، قوس مربع،
ثم رقم ، مثل 0،
1، 2، أو متغير مثل i،
ثم دالة المخطط الخاصة بي
هنا هي نفسها بالضبط.

English: 
So by using i inside of these square
brackets, am I indexing into an array?
To index into an array means
go to a specific location,
the so-called i-th location,
but you start counting at zero.
Just to make this more
real, then, if you go back
to this picture of
your computer's memory,
this might, therefore,
be bracket i, bracket 1--
bracket 0, bracket 1, bracket 2, bracket
3, bracket 4, bracket 50, or wherever.
You can now, using square brackets,
get at any of these blocks of memory
to store values for you.
Any questions on what we've just done?
All right, then on the flip side,
we can do the exact same thing.
Now when I print my scores, I can
similarly iterate from 0 to 3,
and then print out the
scores by passing to chart
the same value, the i-th score.
Again, the only new syntax here
is variable name, square bracket,
and then a number, like 0,
1, 2, or a variable like i,
and then my chart function
down here is exactly the same.

Arabic: 
ليس لديها أدنى فكرة عن أن المصفوفة
متضمَّنة، لأنني فقط
أمرر نتيجة واحدة في وقت واحد.
الآن يتضح أنه لا يزال هناك
قرار تصميم سيئ واحد في هذا البرنامج.
لا يزال هناك بعض التكرار،
شيءٌ أستمر في كتابته مرارًا
وتكرارًا.
هل تظهر أمامك أي قيمة
كأنها مكررة؟
الجمهور: التكرار الحلقي.
ديفيد ج. مالان: التكرار الحلقي.
حسنًا، لقد حصلت على التكرار
الحلقي في أماكن متعددة.
بالتأكيد.
وما هي القيمة الأخرى التي تبدو
في أماكن متعددة؟
إنها دقيقة.
الرقم الإجمالي.
نعم، 3.
ثلاثة في أماكن متعددة.
إنه هنا.
إنه عندما أُعلن المصفوفة
وأسأل نفسي عن ثلاث نتائج.
إنه هنا عندما أقوم بالتكرار.
إنه ليس هنا، لأن هذا
تكرار مختلف.
هذا فقط لرموز الشباك.
حتى في، ويا للسخرية، كتبت 3
في ثلاثة أماكن.
إذًا ماذا يعني هذا؟
حسنًا، لنفترض أن العام المقبل ستأخذون
المزيد من الاختبارات أو ما شابه،
وتحتاجون إلى المزيد من النتائج.

English: 
It has no idea an array is
even involved, because I'm just
passing in one score at a time.
Now it turns out there's still one
bad design decision in this program.
There's still some redundancy,
something that I keep typing again
and again and again.
Do any values jump out
at you as repeated?
AUDIENCE: The for loop.
DAVID J. MALAN: The for loop.
OK, so I've got the for
loop in multiple places.
Sure.
And what other value seems
to be in multiple places?
It's subtle.
Total number.
Yeah, 3.
Three is in a few places.
It's up here.
It's when I declare the array
and ask myself for three scores.
It's here when I'm iterating.
It's not here, because this
is a different iteration.
That's just for the hashes.
So in, ironically, three
places, have I written 3.
So what does this mean?
Well, suppose next year you
take more tests or whatever,
and you need more scores.

English: 
You open up your program, and all right,
now I've got five scores and five--
whoops, typo already-- five,
like this kind of pattern
where you're typing the
same thing again and again.
And now the onus is
on me, the programmer,
to remember to change the same
[? damn ?] value in multiple places--
bad, bad, bad design.
You're going to miss
one of those values.
Your program's going
to get more complex.
You're going to leave one at
3 and change the other to 5,
and logical errors are
eventually going to happen.
So how do we solve this?
The function's not the solution
here, because it's not functionality.
It's just a value.
Well, we could use a variable,
but a certain type of variable.
These numbers here--
5, 5, 5 or 3, 3, 3--
are what humans generally
refer to as magic numbers.
Like they're numbers, but
they're kind of magical,
because you just arbitrarily
hardcoded them in random places.
But a better convention would be, often
as a global variable, to do this--
int, let's call it "count," equals 3.
So declare a variable of type
int that is the number of things
you want, and then type that variable
name all throughout your code
so that later on, if you ever
want to change this program,

Arabic: 
فتفتحون البرنامج الخاص بكم، وحسنًا،
الآن لقد حصلت على خمس نتائج وخمس--
عذرًا، خطأ مطبعي بالفعل-- خمسة،
مثل هذا النوع من النمط
حيث تكتب
الشيء نفسه مرارًا وتكرارًا.
والآن يقع العبء علي،
المبرمج،
لتذكر تغيير القيمة
[? اللعينة ?] نفسها في أماكن متعددة--
تصميم سيء للغاية.
أنت ستنسى
واحدة من تلك القيم.
سيصبح البرنامج الخاص بك
أكثر تعقيدًا.
ستترك واحدًا كما هو
3 وتغيّر الآخرين إلى 5،
وستحدث الأخطاء
المنطقية في النهاية.
إذًا كيف يمكننا حل هذا؟
الدالة ليست الحل
هنا، لأنها ليست وظيفية.
إنها مجرد قيمة.
حسنًا ، يمكننا استخدام متغير،
ولكن نوع معين من المتغيرات.
هذه الأرقام هنا--
5، 5، 5 أو 3، 3، 3--
هي ما يشير إليه الإنسان عمومًا
كأرقام سحرية.
هم أرقام، ولكنهم
سحريين نوعًا ما،
لأنك فقط بشكلٍ تعسفي
تقوم بتضمينهم في أماكن عشوائية.
لكن ستحدث اتفاقية أفضل، في كثير من الأحيان
كمتغير عالمي، وهي القيام بهذا--
int، دعونا نطلق عليها "count"، يساوي 3.
لذا قم بإعلان متغير من النوع
int على أنه عدد الأشياء
الذي تريدها، ثم اكتب اسم هذا
المتغير في جميع أنحاء التعليمات البرمجية الخاصة بك
بحيث وفي وقت لاحق، إذا كنت
ترغب في تغيير هذا البرنامج،

English: 
you change it-- whoops--
in one place, and you're
done after recompiling the program.
And actually, I should do
a little better than this.
It turns out that if you know you have
a variable that you're never going
to change, because it's
not supposed to change--
it's supposed to be a constant value--
C also has a special keyword called
const, where before the data type,
you say, const int, and then the name
and then the value, and this way,
the compiler, Clang, will
make sure that you, the human,
don't screw up and accidentally try
to change the count anywhere else.
There's one other thing notable.
I also capitalize this whole
thing for some reason--
human convention.
Anytime you capitalize all of
the letters in a variable name,
the convention is that
that means it's global.
That means it's defined way up top,
and you can use it anywhere, therefore,
because it's outside all curly braces.
But it's meant to imply and
remind you that this is special.
It's not just a so-called
local variable inside
of a function or inside
of a loop or the like.
Any questions on that?
Yeah.
AUDIENCE: What is [INAUDIBLE]?
Why do you have i plus 1?
DAVID J. MALAN: Oh,
why do I have i plus 1?

Arabic: 
تغيره-- عذرًا--
في مكانٍ واحد، وتكون
قد انتهيت بعد إعادة تحويل البرنامج برمجيًا.
وفي الواقع، يجب علي
فعل أفضل من ذلك قليلاً.
يتضح أنه إذا كنت تعلم أن لديك
متغيرًا لن تقوم أبدًا
بتغييره، لأنه
ليس من المفترض أن يتغير--
من المفترض أن يكون قيمة ثابتة--
لدى C أيضًا كلمة أساسية خاصة تُسمى
const، حيث قبل نوع البيانات،
تقول، const int، ثم الاسم
ثم القيمة، وهكذا،
سيتأكد المحول البرمجي، Clang،
أنك، الإنسان،
لا تفسد وتحاول بطريق الخطأ
تغيير العد في أي مكان آخر.
هناك شيء واحد آخر ملحوظ.
أنا أيضا قمت بتكبير
جميع الحروف لسببٍ ما--
التقليد الإنساني.
في أي وقت تقوم بتكبير كل الأحرف
في اسم متغير،
التقليد ينص على أن
هذا يعني أنها عالمية.
هذا يعني أنه تم تعريفه بطريقة أعلى،
ويمكنك استخدامه في أي مكان، لذلك،
لأنه خارج جميع الأقواس المتعرجة.
ولكن الهدف من ذلك هو التوضيح
وتذكيرك أن هذا أمر مميز.
إنه ليس مجرد ما يُدعى
بمتغير محلي داخل
دالة أو داخل
التكرار الحلقي أو ما شابه ذلك.
أي أسئلة على هذا الجزء؟
أجل.
الجمهور: ما هو [INAUDIBLE]؟
لماذا لديك i زائد 1؟
ديفيد ج. مالان: أوه،
لماذا لدي i زائد 1؟

Arabic: 
اسمحوا لي بتشغيل هذا البرنامج بسرعة.
السؤال هو لماذا لدي i زائد 1
في هذا السطر هنا.
إذًا دعوني أمضي قدمًا
وأقوم بتشغيل make scores 2--
عذرًا-- في الدليل الخاص بي.
Make scores 2 ./scores2, Enter.
أردت فقط من الأشخاص أن يروا
Score 1 وScore 2 وScore 3.
لم أكن أريده أن يرى Score 0 ،Score 1
،Score 2، لأنها تبدو فقط
نوعًا من السخافة للإنسان.
يحتاج الكمبيوتر إلى
التفكير من حيث الأصفار.
الأشخاص والمستخدمين لا يفعلون،
لذا هذا مجرد أمر جمالي.
أي أسئلة أخرى.
نعم.
الجمهور: [INAUDIBLE].
ديفيد ج. مالان: أوه،
سؤال جيد حقًا.
وقد فكرت بهذا
في الواقع في الليلة الماضية
عند محاولة صياغة هذا المثال.
لماذا لا أقوم فقط بدمج
هذين الاثنين للتكرار الحلقي،
لأنهم يتكررون بوضوح
عدد مماثل من المرات؟
هل كانت هذه يد أم مجرد تمطي؟
لا، تمطي.
إذًا هذا في الواقع متعمد.

English: 
Let me run this program real quick.
Why do I have i plus 1 in this
line here, is the question.
So let me go ahead and
run make scores 2--
whoops-- in my directory.
Make scores 2 ./scores2, Enter.
I wanted just the human to see
Score 1 and Score 2 and Score 3.
I didn't want him or her to see Score 0,
Score 1, Score 2, because it just looks
lame to the human.
The computer needs to
think in terms of zeros.
My humans and my users do
not, so just an aesthetic.
Other questions.
Yeah.
AUDIENCE: [INAUDIBLE].
DAVID J. MALAN: Ah,
really good question.
And I actually thought
about this last night
when trying to craft this example.
Why don't I just combine
these two for loops,
because they're clearly iterating
an identical number of times?
Was this a hand or just a stretch?
No, stretch.
So this is actually deliberate.

English: 
If I combine these, what would
change logically in my program?
Yeah.
AUDIENCE: After every [INAUDIBLE]
input, you would [INAUDIBLE]..
DAVID J. MALAN: Yeah, so after
every human input of a score,
I would see that user's
chart, the row of hashes.
Then I'd ask them for another value.
They'd see the chart, another
value, and they'd see the chart.
And that's fine, if that
is the design you want.
Totally acceptable.
Totally correct.
I wanted mine to look a little more
traditional with all of the bars
together, so I effectively had
to postpone printing the hashes.
And that's why I did have
a little bit of redundancy
by getting the user's input
here and then iterating again
to actually print the user's output
as a chart, so just a design decision.
Good question.
Other questions?
All right, so what does this look like?
Actually, you know what?
I can probably do a little better.
Let me open up one final example
involving scores and this thing
called an array.
In Scores 4 here, let
me go ahead and do this.
Now I've changed my chart
function to do a little bit more,
and you might recall from week 0
and 1, we had the call function,

Arabic: 
إذا قمت بدمج هؤلاء، ما الذي
قد يتغير منطقيًا في برنامجي؟
نعم.
الحضور: بعد كل [INAUDIBLE]
المدخلات، قد [INAUDIBLE]..
ديفيد ج. مالان: نعم، إذًا، بعد
كل مُدخل بشري لنتيجة،
كنت سأرى مخطط
المستخدم، صف من رموز الشباك.
ثم سأطلب منهم قيمة أخرى.
سيشاهدون المخطط، قيمة أخرى،
وسيشاهدون المخطط.
وهذا جيد، إذا كان هذا
هو التصميم الذي تريده.
مقبول تمامًا.
صحيح تمامًا.
أردت أن يبدو برنامجي تقليديًا أكثر من ذلك بقليل
مع كل الأشرطة
معًا، لذلك اضطررت بالفعل
لتأجيل طباعة رموز الشباك.
ولهذا السبب لدي
قليل من التكرار
عن طريق الحصول على مدخل المستخدم
هنا ثم التكرار مجددًا
لطباعة مخرج المستخدم
كمخطط، لذلك مجرد قرار تصميم.
سؤال جيد.
أي أسئلة أخرى؟
حسنًا ، ماذا يبدو هذا؟
في الواقع، أتعلم ماذا؟
ربما أستطيع فعل أفضل من ذلك قليلاً.
دعوني أفتح مثالاً واحدًا نهائيًا
يتضمن النتائج وهذا الشيء
المُسمى مصفوفة.
في Scores 4 هنا، دعوني
أمضي قدمًا وأفعل هذا.
الآن قمت بتغيير دالة المخطط لدي
للقيام بالمزيد،
وقد تتذكر من الأسبوع 0
و1، كان لدينا دالة call،

Arabic: 
واستمررنا في تحسينها
لتفعل المزيد،
مثل وضع
المزيد من المنطق.
لاحظوا هذا.
تأخذ دالة Chart الآن وسيطة ثانية،
وهذا أمر مثير للاهتمام.
فهي تأخذ وسيطة واحدة،
والتي تكون رقمًا،
ثم الوسيطة التالية والتي
تكون مصفوفة من scores.
إذن فالقصة الطويلة باختصار،
إذا أردت أن تمتلك دالة
تأخذ مصفوفة كمدخل،
فلا حاجة لك بمعرفة
مدى حجم تلك المصفوفة سلفًا.
في الحقيقة، لا ينبغي عليك
وضع رقم بين أقواس مربعة
في هذا السياق.
لكن الشيء الذي تحتاج
لمعرفته، في مرحلة ما
هو كم عدد العناصر في المصفوفة.
إذا قمت بالبرمجة في Java، أو أخذت إلحاق
متقدم في علوم الكمبيوتر، فسيمنحك Java فقط. طول،
إذا كنت تتذكر ميزة الكائنات هذه.
لا تمتلك لغة C هذا.
لا تحتوي المصفوفات على
طول متأصل مرتبط بها.
يجب أن تخبر كل فرد يستخدم
مصفوفتك عن مدى طولها.
لذا على الرغم من أنك لا تقوم
بهذا هنا من ناحية الصيغ،
فأنت حرفيًا تقول فقط،
أنا أتوقع وسيطة تسمى scores
وهي مصفوفة في الأقواس المربعة.
يجب عليك غالبًا دومًا
تمرير متغير ثانٍ
يتم تسميته بما تريد،
لكنه عدد من الأشياء
في هذه المصفوفة،

English: 
and we kept enhancing
it to do more and more,
like putting more and
more logic into it.
Notice this.
Chart function now takes a second
argument, which is kind of interesting.
It takes one argument,
which is a number,
and then the next argument
is an array of scores.
So long story short, if you
want to have a function that
takes as input an array,
you don't have to know
in advance how big that array is.
You should not, in fact, put a
number in between the square brackets
in this context.
But the thing is you do
need to know, at some point,
how many items are in the array.
If you've programmed in Java, took
AP CS, Java just gives you .length,
if you recall that feature of objects.
C does not have this.
Arrays do not have an inherent
length associated with them.
You have to tell everyone who
uses your array how long it is.
So even though you don't
do that syntactically here,
you literally just say, I expect
an argument called scores that
is an array per the square brackets.
You have to pass and almost
always a second variable
that is literally called
whatever you want,
but is the number of
things in that array,

English: 
because if the goal of
this function is just
to iterate over the number
of scores that are passed in,
and then iterate over the
number of points in that score
in order to print out the hashes,
you need to know this count.
So what does this function
do, just to be clear?
This iterates over the total
number of scores from 0 to count,
which is probably 3 or 5 or whatever.
This loop here, using J,
which is just a convention,
instead iterates from 0 to
whatever that i-th score is.
So this is what's convenient.
Now I've passed in the array, and I
can still get at individual values
just by using i, because I'm
on my i-th iteration here.
So you might recall this from Mario,
for instance, or any other example
in which you had nested loops--
just very conventional to use i
on the outside, j on the inside.
But again, the only point here is that
you can, indeed, pass around arrays,
even as arguments, which we'll
see why that's useful before long.

Arabic: 
لأنه إذا كان هدف
هذه الدالة هو فقط
تكرار أكثر لعدد النتائج
التي تم تمريرها،
ثم التكرار أكثر لعدد
النقاط في هذه النتيجة
من أجل طباعة علامات الشباك،
فعليك أن تعرف هذا العدد.
لذا ما الذي تقوم به هذه الدالة،
فقط للتوضيح؟
إنها تكرر أكثر عدد
الإجمالي للنتائج من 0 إلى عدد،
وهو على الأرجح 3 أو 5 أو أيًا كان.
هذا التكرار الحلقي هنا، والذي
يستخدم J، وهو فقط المتعارف عليه،
يكرر من 0 إلى
درجة i-th أيًا كانت.
لذا هذا ما يعتبر مناسب.
الآن لقد قمت بالتمرير في المصفوفة،
وما زلت أستطيع الحصول على قيم فردية
فقط باستخدام i،
لأنني في تكرار i-th هنا.
لذا قد تتذكر هذا من ماريو،
على سبيل المثال، أو أي مثال آخر
حيث يكون لديك تكرار حلقي متداخل--
من المتعارف عليه جدًا استخدام i في
الخارج، وj في الداخل.
لكن مرة أخرى، فإن النقطة الوحيدة هنا هي
أننا نستطيع، بالفعل، تمرير المصفوفات،
حتى كوسائط، والذي
سنفهم سبب فائدته قريبًا.

English: 
Any questions?
OK, so this was a lot, but we can
do so much more still with arrays.
It gets even more and more cool.
In fact, we'll see, in just a
bit, how arrays have actually
been with us since last week.
We just didn't quite realize it
under the hood, but let's go ahead
and take a breather, five minutes.
We'll come back and dive in.
All right.
So I know that was a
bit of a cliffhanger.
Where else could arrays
have actually been?
But, of course, this is how we
might depict it pictorially.
We called it an array, and it
turns out that last week, when
we introduced strings, strings,
sequences of characters,
are literally just an
array by another name.
A string is an array of chars, and
chars, of course, is another data type.
Now what are the actual
implications of this,
both in terms of representation,
like how a computer's representing
information, and then
fundamentally, programmatically,
what can we do when we
know all of our data
is so back to back to back or
so proximal to one another?
Well, it turns out that we can apply
this logic in a few different ways.

Arabic: 
أي أسئلة؟
حسنًا، إذًا كان هذا كثيرًا، لكن
يمكننا أن نفعل أكثر بكثير باستخدام المصفوفات.
إنها تصبح رائعة أكثر وأكثر.
في الواقع، سنرى، خلال لحظات،
كيف كانت المصفوفات بالفعل
معنا منذ الأسبوع الماضي.
إننا لم نلاحظها تمامًا تحت الغطاء،
لكن دعونا نمضي قدمًا
ونأخذ استراحة، خمس دقائق.
سنعود ونتعمق في الأمر.
حسنًا.
أنا أعرف أن هذا كان
مشوقًا قليلاً.
أين يمكن أيضًا أن
تكون المصفوفات بالفعل؟
لكن، بالطبع، هذه هي الطريقة
التي قد نصورها بها بشكل تصويري.
نحن أطلقنا عليها مصفوفة، ومن الواضح
أنه في الأسبوع الماضي، عندما
قمنا بتقديم السلاسل،
وهي تسلسلات من الحروف،
والتي كانت حرفيًا مصفوفة باسم آخر.
فالسلسلة هي مصفوفة من الحروف،
والحروف، بالطبع، هي نوع بيانات آخر.
الآن، ما هي الآثار الفعلية لهذا،
كلاهما من حيث التمثيل،
مثل طريقة تمثيل الكمبيوتر
للمعلومات، وبشكل
أساسي، وبرمجي
ماذا يمكننا أن نفعل عندما
نعرف أن جميع بياناتنا
متصلة عل التوالي
أو قريبة جدًا لبعضها البعض؟
حسنًا، من الواضح أنه يمكننا تطبيق
هذا المنطق بعدة طرق مختلفة.

English: 
Let me go ahead and
open up, for instance,
an example here called String 0.
So in our code for today,
in our Source 2 folder,
let me go ahead and open up String
0, and this example looks like this.
Notice that we first, on line
9, get a string from the user.
Just say, input, please.
We store that value in a string, s,
and then we say, here comes the output.
And notice what I'm doing
in the following line.
I'm iterating over i from 0
to strlen, whatever that is.
And then in line 13, I'm printing
a character one at a time.
But notice the syntax I'm using,
which we didn't use last week.
If you have a string called
s, you can index into a string
just like it's an array, because
it, indeed, is underneath the hood.
So s bracket i, where
i starts at 0 and goes
up to whatever this value is is just
a way of getting character 0, then
character 1, then character
2, then character 3,

Arabic: 
اسمحوا لي بالمضي قدمًا
وفتح، على سبيل المثال،
مثال هنا يسمى String 0.
لذا في التعليمة البرمجية الخاصة بنا لهذا اليوم،
في مجلد Source 2 الخاص بنا،
اسمحوا لي بالمضي قدمًا وفتح String
0، وهذا المثال يبدو مثل هذا.
لاحظوا أننا أولاً، على السطر 9،
نحصل على سلسلة من المستخدم.
فقط قل، مدخل، من فضلك.
فإننا نقوم بتخزين القيمة في string, s،
ثم نقول، هنا يأتي المخرج.
ولاحظوا ما أقوم به في السطر التالي.
أنا أكرر أكثر i من 0 إلى strlen،
أيًا كان هذا.
ثم في السطر 13 أقوم بطبع
حرف واحد في كل مرة.
لكن لاحظوا الصيغة التي أستخدمها،
والتي لم نستخدمها الأسبوع الماضي.
إذا كانت لديك سلسلة تسمى s،
فيمكنك فهرستها إلى سلسلة
تمامًا كأنها مصفوفة، لكنها،
بالفعل، غير ظاهرة.
إذًا s قوس i، حيث تبدأ i
من الصفر فصاعدًا
إلى أي قيمة كانت هذه، فإنها
طريقة للحصول على الحرف 0، ثم
الحرف 1،ثم الحرف
2، ثم الحرف 3،

English: 
and so the end result is
actually going to look like this.
Let me go ahead and do, make string--
whoops-- make string 0.
Oops.
Not in the directory.
Make string 0, ./string0, Enter,
and I'll type in, say, Zamyla,
and the output now is
Z-A-M-Y-L-A. It's a little messy,
because I don't have a new line here, so
let me actually-- let's clean that up,
because this is unnecessarily sloppy.
So let me go ahead and
print out a new line.
Let me recompile with
make string 0, dot--
whoops-- ./string0.
Input shall be Zamyla,
Enter, and now Z-A-M-Y-L-A.
So why is that happening?
Well, if I scroll down on
this code, it seems that I am,
via this printf line here, just getting
the i-th character of the name in s,
and then printing out one
character at a time per the %c,
followed by a new line.

Arabic: 
وبالتالي فستبدو النتيجة
النهائية مثل هذا.
اسمحوا لي بالمضي قدمًا، وكتابة make string--
عذرًا-- make string 0.
عذرًا.
ليس في هذا الدليل.
Make string 0، ./string0، Enter،
وسأكتب فيه، قل، Zamyla،
والمخرج الآن هو
Z-A-M-Y-L-A. إنها فوضوية قليلاً،
لأنني لم يكن لدي سطر جديد هنا، لذا
اسمحوا لي بالفعل-- دعونا نزيل هذا،
لأن هذا أمر سيء لا داعي له.
لذا اسمحوا لي بالمضي قدمًا
وطباعة سطر جديد.
اسمحوا لي بإعادة تجميعه
باستخدام make string 0، نقطة--
عذرًا-- ./string0.
المدخل يجب أن يكون Zamyla،
Enter، والآن Z-A-M-Y-L-A.
إذًا لماذا يحدث هذا؟
حسنًا، إذا قمت بالتمرير لأسفل في هذه
التعليمة البرمجية، فيبدو أنني،
عبر سطر printf هنا، أحصل على حرف
i-th من الاسم الموجود في s،
ثم أطبع حرفًا واحدًا
في كل مرة لكل %c،
يتبعه سطر جديد.

Arabic: 
لذا فقد تخمنوا،
ماذا تفعل هذه الدالة هنا؟
Strlen-- مختصرة بشكل طفيف،
لكن يمكنك، ربما، فهم ما تعنيه.
حسنًا، إنه في الواقع طول السلسلة.
لذا من الواضح أن
هناك دالة تأتي
مع لغة C تسمى strlen،
وأن البشر في السابق
وحاليًا يحبون الكتابة بعدد حروف
أقل عندما يكون ذلك ممكنًا.
وبالتالي فإن strlen هي طول السلسلة،
والطريقة التي تستخدمها هي
أنك فقط بحاجة إلى ملف رأس واحد آخر.
لذا يوجد هناك مكتبة أخرى
تسمى مكتبة السلسلة
والتي تعطيك دوال ذات
صلة بالسلسلة
وتتجاوز ما تقدمه مكتبة CS50.
وبالتالي إذا قمت بتضمين string.h،
التي تمنحك الوصول
إلى دالة أخرى تسمى strlen،
إذا قمت بإعطائها،
متغيرًا يتضمن سلسلة،
فستعيد التمرير إليك
عدد الحروف
كقيمة إرجاع إجمالي.
لذا لقد قمت بكتابة Z-A-M-Y-L-A،
لذا يجب أن يرجع إلي هذا ستة،
وبالتالي طباعة ستة أحرف
في اسم Zamyla.
أجل.
الجمهور:[INAUDIBLE].
ديفيد ج. مالان: اه.
الجمهور: [INAUDIBLE] مفيد للحصول
على أرقام فردية [INAUDIBLE]..
ديفيد ج. مالان: سؤال جيدحقًا.

English: 
So you might guess, what is
this function here doing?
Strlen-- slightly abbreviated, but
you can, perhaps, glean what it means.
Yeah, so it's actually string length.
So it turns out there
is a function that comes
with C called strlen, and
humans back in the day
and to this day like to type as
few characters when possible.
And so strlen is string length,
and the way you use it is you
just need one more header file.
So there's another library,
the so-called string
library that gives you
string-related functions
beyond what CS50's library provides.
And so if you include
string.h, that gives you access
to another function called
strlen, that if you pass it,
a variable containing a
string, it will pass you back
as a return value the
total number of characters.
So I typed in Z-A-M-Y-L-A, and so
that should be returning to me six,
thereby printing out the six
characters in Zamyla's name.
Yeah.
AUDIENCE: [INAUDIBLE].
DAVID J. MALAN: Uh-huh.
AUDIENCE: [INAUDIBLE] useful to get
the individual digits [INAUDIBLE]..
DAVID J. MALAN: Really good question.

English: 
In the credit problem of the problem
set, would this have been useful?
Yes, absolutely.
But recall that in the credit
pset, we encourage you to actually
take in the number as a long,
so as an integral value, which
thereby necessitated arithmetic.
But yes, if you had, instead, in
a problem involving credit card
numbers, gotten the human's input
as a long string of characters
and not as an actual number
like an int or a long,
then, yes, you could actually get
at those individual characters,
which probably would have made
things even easier but deliberate.
Yeah.
AUDIENCE: [INAUDIBLE].
DAVID J. MALAN: Really good question.
If we're defining string in CS50,
are we redefining it in string?
No.
So string, even though
it's named string.h,
doesn't actually define
something called a string.
It just has string-related functions.
More on that soon.
Yeah.
AUDIENCE: [INAUDIBLE]
individual values [INAUDIBLE]??
DAVID J. MALAN: Ah,
really good question.
Could you edit the individual values?
So short answer, yes.
We could absolutely change values, and
we'll soon do that in another context.
Other questions?

Arabic: 
في مشكلة الائتمان لمجموعة المشكلة،
هل كان هذا مفيدًا؟
نعم بالتأكيد.
لكن تذكر أن في الائتمان لـ pset،
نحن نشجعك في الواقع
على أن تأخذ الرقم مثل رقم طويل،
ليتسنى للقيمة المتكاملة، والتي
استلزمت بعض الحسابات.
لكن أجل، إذا كان لديك، بدلاً من ذلك،
مشكلة تتعلق بأرقام بطاقة الائتمان
وحصلت على مدخل الإنسان
كسلسلة طويلة من الأحرف
وليس كعدد حقيقي
مثل عدد صحيح أو طويل،
إذًا، نعم، يمكنك بالفعل
الحصول على تلك الحروف الفردية،
والتي ربما كانت ستجعل
الأشياء أسهل لكنها متعمدة.
أجل.
الجمهور: [INAUDIBLE].
ديفيد ج. مالان: سؤال جيدحقًا.
إذا قمنا بتعريف السلسلة في CS50،
فهل سنعرفها مرة أخرى في سلسلة؟
لا.
حتى السلسلة، بالرغم من
أنها تدعى string.h،
فإنها لا تعرف شيء ما يدعى string.
إنها تحتوي على
دوال ذات صلة بالسلسلة فقط.
المزيد من ذلك قريبًا.
أجل.
الجمهور: [INAUDIBLE]
قيم فردية [INAUDIBLE]؟؟
ديفيد ج. مالان: اه،
سؤال جيد حقًا.
هل يمكنك تعديل القيم الفردية؟
إجابة مختصرة، نعم.
يمكننا بالطبع تغيير القيم،
وسنقوم بذلك قريبًا في سياق آخر.
أي أسئلة أخرى؟

English: 
All right, so turns out this
is correct, if my goal is
to print out all of the
characters in Zamyla's name,
but it's not the best design.
And this one's a little subtle, but
this is, again, what we mean by design.
And to a question that
came up during the break,
did we expect everyone to be writing
good style and good design last week?
No.
Up until today, like we've
introduced the notion of correctness
in both Scratch and in C
last week, but now we're
introducing these other
axes of quality of code
like design, how well-designed
it is, and how pretty
does it look in the context of style.
So expectations are here on out meant to
be aligned with those characteristics,
but not in the past.
So there's a slight inefficiency here.
So on the first iteration of this
loop, I first initialize i to 0,
and then I check if i less than the
length of the string, which hopefully,
it is, if it's Zamyla,
which is longer than 0.
Then I print the i-th character.
Then I increment i.
Then I check this condition.
Then I print the i-th character.
Then I increment i.
Then I check this
condition and so forth.

Arabic: 
حسنًا، إذًا من الواضح أن هذا صحيح،
إذا كان هدفي هو
طباعة جميع الحروف
في اسم Zamyla،
لكنه ليس التصميم الأفضل.
ولكن هذا التصميم دقيق قليلاً، لكنه، ثانيةً
ما نعنيه بشأن التصميم.
وردًا على السؤال الذي
طُرح خلال فترة الراحة،
هل توقعنا من الجميع الكتابة
بأسلوب جيد وتصميم جيد الأسبوع الماضي؟
لا.
حتى اليوم، قدمنا
فكرة الصواب
في كل من Scratch ولغة C
الأسبوع الماضي، لكن الآن نحن
نقدم محاور جودة
التعليمات البرمجية الأخرى
مثل التصميم، ومدى جودة
التصميم، ومدى الجمالية
في سياق الأسلوب.
لذا التوقعات هنا من المفترض
أن تتماشى مع تلك الخصائص،
لكن ليس في الماضي.
لذلك يوجد عدم كفاءة طفيفة هنا.
لذا في التكرار الأول في
هذا التكرار الحلقي، أقوم أولاً بتهيئة i إلى 0،
ثم أتحقق مما إذا كانت i أقل من
طول السلسلة، والتي نأمل،
أن يكون كذلك، إذا كان Zamyla،
والذي هو أطول من 0.
سأطبع الحرف i-th.
سأقوم بزيادة i.
سأتحقق من هذا الشرط.
سأطبع الحرف i-th.
سأقوم بزيادة i.
سأتحقق من
هذا الشرط وهكذا.

Arabic: 
مررنا من خلال التكرار الحلقي الأسبوع الماضي،
وكنتم قد استخدمتموه، ربما،
حتى الآن في المشاكل.
ما السؤال الذي أسأله
بشكل متكرر ودون داعٍ؟
يجب أن أتحقق من
الشرط مرارًا وتكرارًا،
لأن i تزيد.
لكن هناك سؤال آخر
والذي لا أحتاج
إلى الاستمرار في سؤاله
للحصول على الإجابة نفسها.
الجمهور: ما هو
طول [? السلسلة? ?]
ديفيد ج. مالان: أجل،
هناك دالة call هذه
في التكرار الحلقي الخاص بـ strlen، s،
وهذا جيد.
هذا صحيح.
أنا أتحقق من طول
السلسلة، لكن بمجرد كتابة Zamyla،
اسمها لا يتغير في الطول.
أقوم بزيادة i، لذا
أتنقل في السلسلة، إذا صح التعبير.
لكن السلسلة نفسها،
Z-A-M-Y-L-A، لا تتغير.
فلماذا أطلب من الكمبيوتر، مرارًا
وتكرارًا، أن يعطيني strlen الخاص بـ s،
أن يعطيني strlen الخاص بـ s،
أن يعطيني strlen الخاص بـ s.
لذا يمكنني بالفعل إصلاح هذا.
يمكنني تحسين التصميم، لأن
هذا يجب أن يأخذ بعض الوقت.
ربما إنه سريع، لكنه لا يزال
كمية غير صفرية من الوقت.
لذا هل تعرف ما الذي يمكنني فعله؟
يمكنني القيام بشيء مثل هذا--
int n get string length of s.

English: 
We looped through loops last week,
and you've used them, perhaps,
by now in problems.
What question am I redundantly
asking seemingly unnecessarily?
I have to check a
condition again and again,
because i is getting incremented.
But there's another
other question that I
don't need to keep asking again
just to get the same answer.
AUDIENCE: What is the
length [? of the string? ?]
DAVID J. MALAN: Yeah,
there's this function call
in my loop of strlen s, which is fine.
This is correct.
I'm checking the length of the
string, but once I type in Zamyla,
her name is not changing in length.
I'm incrementing i, so I'm moving
in the string, if you will.
But the string itself,
Z-A-M-Y-L-A, is not changing.
So why am I asking the computer, again
and again, get me the strlen of s,
get me the strlen of s,
get me the strlen of s.
So I can actually fix this.
I can improve the design, because
that must take some amount of time.
Maybe it's fast, but it's still
a non-zero amount of time.
So you know what I could do?
I could do something like this--
int n get string length of s.

English: 
And now just do this.
This would be better design, because
now I'm only asking the question once
of the function.
I'm remembering or caching, if
you will, the answer, and then
I'm just using a variable.
And just comparing
variables is just faster
than comparing a variable against
a function, which has to be called,
which has to return a value,
which you can then compare.
But honestly, it doesn't
have to be this verbose.
We can actually be a
little elegant about this.
If you're using a loop,
a secret feature of loops
is that you can have commas
after declaring variables.
And you can actually do this and make
this even more elegant, if you will,
or more confusing-looking,
depending on your perspective.
But this now does the same thing
but declares n inside of the loop,
just like I'm declaring i, and
it's just a little tighter.
It's one fewer lines of code.
Any questions, then?
AUDIENCE: [INAUDIBLE].
DAVID J. MALAN: Good question.
In the way I've just done it cannot
reuse this outside of the curly braces.
The scope of i and n exists
only in this context right now.

Arabic: 
والآن أفعل هذا فقط.
هذا من شأنه أن يكون تصميم أفضل، لأن
الآن أنا فقط أسأل السؤال مرة واحدة
من الدالة.
أنا أتذكر أو أقوم بالتخزين المؤقت،
إذا صح التعبير، للإجابة، ثم
أستخدم فقط متغيرًا.
ومقارنة
المتغيرات تصبح أسرع
من مقارنة متغير مقابل
دالة، والتي يجب أن تُسمى،
والتي تصبح قيمة معادة،
والتي يمكنك مقارنتها بعد ذلك.
ولكن بصراحة، إنه لا
يجب أن يكون بهذا الإطناب.
يمكن بالفعل أن نكون
منمقين أكثر بشأن هذا.
إذا كنت تستخدم التكرار الحلقي،
ميزة سرية في التكرارات الحلقية
هي أنه يمكنك الحصول على فواصل
بعد إعلان المتغيرات.
ويمكنك بالفعل القيام بهذا وفعل
هذا بصورةٍ أكثر أناقة، إذا صح التعبير،
أو بصورةٍ مربكة أكثر،
اعتمادًا على وجهة نظرك.
لكن هذا الآن يفعل الشيء نفسه
لكنه يعلن n داخل التكرار الحلقي،
تمامًا كما أحدد i،
وإنه أكثر إحكامًا بقليل.
إنه سطر واحد أقل من التعليمات البرمجية.
أية أسئلة أخرى؟
الجمهور: [INAUDIBLE].
ديفيد ج. مالان: سؤال جيد.
بالطريقة التي قمت بها لا يمكن إعادة
استخدام هذا خارج الأقواس المتعرجة.
يوجد نطاق i وn
في هذا السياق فقط الآن.

English: 
The other way, yes.
I could have used it elsewhere.
AUDIENCE: What if you [INAUDIBLE] other
loops, and you also had [INAUDIBLE]??
DAVID J. MALAN: Absolutely.
AUDIENCE: Using different
letters of the alphabet,
you could just use n
and not be [INAUDIBLE]..
DAVID J. MALAN: Correct.
If I want to use the length
of s again, absolutely.
I can declare the variable, as I
did earlier, outside of the loop,
so as to reuse it.
That's totally fine.
Yes.
And even i-- i exists only inside of
this loop, so if I have another loop,
I can reuse i, and it's a different
i, because these variables only
exist inside the for loop
in which they're declared.
So it turns out that these strings
don't have anything in them
other than character after
character after character.
And in fact, let me
go ahead here and draw
a picture of what's actually going on
underneath the hood of the computer
here.
So when I type in Zamyla's
name, I'm, of course,

Arabic: 
الطريقة الأخرى، نعم.
كان يمكن أن أستخدمها في مكانٍ آخر.
الجمهور: ماذا لو كنت [INAUDIBLE]
من تكرار حلقي آخر، ولديك أيضًا [INAUDIBLE]؟؟
ديفيد ج. مالان: بالتأكيد.
الجمهور: استخدام حروف
أبجدية مختلفة،
يمكنك استخدام n
وليس [INAUDIBLE]..
ديفيد ج. مالان: صحيح.
إذا كنت أرغب في استخدام طول
s مجددًا، بالتأكيد.
يمكنني تحديد المتغير، كما
فعلت سابقًا، خارج التكرار الحلقي،
حتى يمكنني إعادة استخدامه.
هذا جيد تمامًا.
نعم.
وحتى i-- توجد i فقط داخل
هذا التكرار الحلقي، لذا إذا كان لدي تكرار حلقي آخر،
يمكنني إعادة استخدام i، وهي i
مختلفة، لأن هذه المتغيرات فقط
توجد داخل التكرار الحلقي
الذي تم تحديدهم فيه.
إذًا من الواضح أن هذه السلاسل
لا يوجد بداخلها أي شيء
بخلاف حرف بعد
حرف بعد حرف.
وفي الواقع، دعوني أمضي
قدمًا هنا وأرسم
صورة لما يحدث بالفعل
تحت غطاء الكمبيوتر
هنا.
لذا عندما أكتب اسم
Zamyla، فأنا، بالطبع،

Arabic: 
أقوم بشيء مثل Z-A-M-Y-L-A.
لكن أين يذهب هذا بالفعل؟
حسنًا، نحن نعرف الآن أن بداخل الكمبيوتر
ذاكرة الوصول العشوائي أو الذاكرة،
ويمكنك تخيلها كشبكة.
وبصراحة، يمكنني التفكير
في هذه الشاشة بأكملها
كما يجري في مختلف
الاتجاهات، كشبكة من الذاكرة.
لذا على سبيل المثال، ربما يمكننا تقسيمها
إلى صفوف وأعمدة مثل هكذا، ليس
بالضرورة على نطاق واسع،
ويوجد العديد من الصفوف والأعمدة.
إذًا على الشاشة هنا،
أنا فقط أُقسم الأشياء
إلى وحدات بايت فردية
من الذاكرة التي رأيناها منذ لحظة.
وهكذا، في الواقع، تحت غطاء
الكمبيوتر يوجد تخطيط الذاكرة.
اكتشف المحول البرمجي بطريقةٍ ما
أو اكتشف البرنامج بطريقةٍ ما
أين يضع z وأين يضع a
وأين يضع m وأين يضع y وأين يضع l وأين يضع a،
لكن الأساس هو أنهم جميعًا
متجاورون، على التوالي مع بعضهم البعض.
ولكن تكمن المشكلة إذا كنت أكتب كلمات
أخرى في برنامجي أو نتائجي
في برنامجي أو أي بيانات
في برنامجي،
سوف ينتهي الأمر في مكان آخر
في ذاكرة الكمبيوتر.
إذًا كيف تعرف أين تبدأ Zamyla وأين
تنتهي، إذا جاز التعبير، في الذاكرة؟

English: 
doing something like Z-A-M-Y-L-A.
But where is that actually going?
Well, we know now that inside of
your computer is RAM or memory,
and you can think of it like a grid.
And honestly, I can think
of this whole screen
as just being in a different
orientation, a grid of memory.
So for instance, maybe we can divide
it into rows and columns like this, not
necessarily to scale, and
there's more rows and columns.
So on the screen here,
I'm just dividing things
into the individual bytes of
memory that we saw a moment ago.
And so, indeed, underneath the hood of
the computer is this layout of memory.
The compiler has somehow figured out
or the program has somehow figured out
where to put the z and where the a and
the m and the y and the l and the a,
but the key is that they're all
contiguous, back to back to back.
But the catch is if I'm typing other
words into my program or scores
into my program or any
data into my program,
it's going to end up elsewhere
in the computer's memory.
So how do you know where
Zamyla begins and where
Zamyla ends, so to speak, in memory?

Arabic: 
حسنًا، المتغير، المدعو s،
موجود هنا بشكل أساسي.
هناك تذكر ما في الكمبيوتر
للمكان الذي يبدأ s منه.
لكن ليست هناك طريقة واضحة
لمعرفة أين تنتهي Zamyla،
إلا إذا أخبرنا الكمبيوتر بأنفسنا.
إذًا وبدون علم منا، في أي وقت
يقوم الكمبيوتر بتخزين سلسلة مثل
Z-A-M-Y-L-A، يتضح أنه لا يستخدم
واحد، اثنين، ثلاثة، أربعة، خمسة
ستة حروف.
في الواقع إنه يستخدم سبعة سرًا.
إنه في الواقع
يضع حرفًا خاصًا
لجميع الأصفار في وحدات البايت الأخيرة جدًا.
كل وحدة بايت تساوي ثمان وحدات بت،
لذا فإنها تضع سرًا ثمان أصفار هنا،
أو يمكننا بالفعل رسم هذا
بطريقة متعارف عليها أكثر كـ /0.
وهذا ما يسمى بالحرف الفارغ،
ويعني تمامًا جميع الأصفار.
لذا فإن طول السلسلة،
Zamyla، هو ستة،
لكن كم عدد وحدات البت التي
تأخذها على ما يبدو، فقط للتوضيح؟
إذًا في الواقع إنها تأخذ سبعة.
وهذا نوع من تفاصيل
التنفيذ السرية
الذي لانهتم حقًا بأمره،
لكن في النهاية، سنفعل ذلك،
لأن إذا أردنا تنفيذ دالة معينة،

English: 
Well, the variable, called
s, essentially is here.
There's some remembrance in
the computer of where s begins.
But there's no obvious way
to know where Zamyla ends,
unless we ourselves tell the computer.
So unbeknownst to us, any time a
computer is storing a string like
Z-A-M-Y-L-A, it turns out that it's
not using one, two, three, four, five,
six characters.
It's actually using seven secretly.
It's actually putting
a special character
of all zeros in the very last bytes.
Every byte is eight bits, so it's
putting secretly eight zeros there,
or we can actually draw this
more conventionally as /0.
It's what's called the null character,
and it just means all zeros.
So the length of the
string, Zamyla, is six,
but how many bytes does it
apparently take up, just to be clear?
So it actually takes up seven.
And this is kind of a
secret implementation detail
that we don't really have to care
about, but eventually, we will,
because if we want to implement
certain functionality,

Arabic: 
فسنكون بحاجة إلى معرفة
ما الذي يحدث في الواقع.
لذا فعلى سبيل المثال، اسمحوا
لي بالمضي قدمًا والقيام بذلك.
اسمحوا لي بالمضي قدمًا وإنشاء
برنامج يسمى strlen نفسه.
إذًا هذه ليست دالة لكنه
برنامج يسمى strlen.c.
اسمحوا لي بالمضي قدمًا وتضمين
مكتبة CS50 في الجزء العلوي.
اسمحوا لي بالمضي قدمًا وتضمين stdio.h.
اسمحوا لي بالمضي قدمًا وكتابة main void،
كل هذا متماثل كما هو الحال دائمًا.
اسمحوا لي بالمضي قدمًا وحث
المستخدم، لنقل، لاسمه أو اسمها،
مثل ذلك.
ثم أتعلمون ماذا؟
اسمحوا لي بالفعل، هذه
المرة، عدم طباعة أسمائهم فقط،
لأننا قمنا بهذه الوسيطة.
دعونا فقط نعد عدد الأحرف
في اسمه أو اسمها.
إذًا كيف يمكننا فعل ذلك؟
حسنًا، يمكننا فقط القيام بهذا-- int
n get strlen من s، ثم نقول،
printf "The length of your name is %i."
ومن ثم يمكننا إدخال n،
لأن هذا هو
الرقم الذي قمنا بتخزين الطول فيه.
لكن لاستخدام strlen،
يجب أن أضمن أي ملف رأس؟
String.h، وهي سلسلة
جديدة، لذا string.h.

English: 
we're going to need to know
what is actually going on.
So for instance, let me
go ahead and do this.
Let me go ahead and create a
program called strlen itself.
So this is not a function but
a program called strlen.c.
Let me go ahead and include
the CS50 library at the top.
Let me go ahead and include stdio.h.
Let me go ahead and type out main
void, so all this is same as always.
And then let me go ahead and prompt
the user for, say, his or her name,
like so.
And then you know what?
Let me actually, this time,
not just print their name out,
because we've done that ad nauseam.
Let's just count the number
of letters in his or her name.
So how could we do that?
Well, we could just do this-- int
n get strlen of s, and then say,
printf "The length of your name is %i."
And then we can plug
in n, because that's
the number we stored the length in.
But to use strlen, I have
to include what header file?
String.h, which is the
new one, so string.h.

English: 
And now if I type this all correctly,
make strlen, make strlen, good.
./strlen-- let's try it--
Zamyla.
Enter.
OK, the length of her name is six.
But what is strlen doing?
Well, strlen is just an abstraction
for us that someone else wrote,
and it's wonderfully convenient, but
you know, we don't strictly need it.
I can actually do this myself.
If I understand what
the computer is doing,
I can implement this same
functionality myself as follows.
I can declare a variable called
n and initialize it to 0,
and then you know what?
I'm going to go ahead and do this.
While s bracket n does
not equal all zeros,
but you don't write all zeros like this.
You literally do this--
that /0 to which I referred
earlier in single quotes.
That just means all zeros in the bytes.
And now I can go ahead and do n++.
If I'm familiar with what
this means, remember,
that this is just n equals n plus 1, but
it's just a little more compact to say,
n++.
And then I can print
out the name of your n--
the name of your n--

Arabic: 
والآن إذا طبعت هذا بشكل صحيح،
make strlen، make strlen، جيد.
./strlen-- دعونا نجربها--
Zamyla.
Enter.
حسنًا، طول الاسم هو ستة.
لكن ماذا يفعل strlen؟
حسنًا، strlen هو فقط تجريد
لنا، قام شخص آخر بكتابته،
وهو متعارف عليه بشكل رائع،
لكن تعلمون، لا حاجة لنا به أبدًا.
يمكنني القيام بهذا بنفسي.
إذا فهمت ما الذي
يقوم به الكمبيوتر،
فيمكنني تنفيذ هذه الوظيفة
نفسها بنفسي كما يلي.
يمكنني الإعلان عن متغير
يسمى n وأهيئه إلى 0،
ثم أتعلمون ماذا؟
سأمضي قدمًا وأفعل هذا.
في حين أن s قوس n لا
يساوي جميع الأصفار،
لكنك لا تكتب جميع الأصفار مثل هذا.
أنت تفعل ذلك حرفيًا--
أن /0 والتي أشرت إليها سابقًا
في علامات الاقتباس المفردة.
وهذا يعني تمامًا جميع الأصفار في وحدات البايت.
والآن يمكنني المضي قدمًا وكتابة n++.
إذا كنت على دراية بما
يعنيه هذا، تذكروا،
أن هذا هو مجرد n يساوي n زائد 1،لكن
إنه موجز قليلاً لقول،
n++.
ثم يمكنني طباعة
اسم n الخاص بك--
اسم n الخاص بك--

English: 
the name of-- the length of
your name is %i, plugging in n.
So why does this work?
It's a little funky-looking,
but this is just
demonstrating an understanding
of what's going on
underneath the proverbial hood.
If n is initialized to zero,
and I look at s bracket n,
well, that's like
looking at s bracket 0.
And if the string, s, is
Zamyla, what is s bracket 0?
Z. And then it does not equal /0.
It equals z, obviously.
So we increment n.
So now n is 1.
Now n is 1.
So what is s bracket 1 in Zamyla's name?
A and so forth, and we get to
Z-A-M-Y-L-A, then all zeros,
the so-called null character, or /0.
That, of course, does equal
/0, so the loop stops,
thereby leaving the total count or
value of n at what it previously was,
which was 6.
So that's it.
Like all underneath
the hood, all we have
is memory laid out like this,
top to bottom, left to right,

Arabic: 
اسم-- طول اسمك
هو %i، داخل في n.
إذًا لماذا يعمل هذا؟
إنه يبدو غريب قليلاً،
لكن هذا فقط
يدل على فهم ما يحدث
أسفل الغطاء المشهور.
إذا تمت تهيئة n لصفر،
ونظرت إلى s قوس n،
حسنًا، فهذا يشبه
النظر إلى s قوس 0.
وإذا كانت السلسلة، s، هي
Zamyla، فما هو s قوس 0؟
Z. وهي بعد ذلك لا تساوي /0.
إنها تساوي z، بالتأكيد.
إذًا نحن نقوم بزيادة n.
إذًا الآن n تساوي 1.
الآن n تساوي 1.
إذًا ما هو s قوس 1 في اسم Zamyla؟
A وهكذا، ونحصل على
Z-A-M-Y-L-A، ثم جميع الأصفار،
التي تسمى بالحرف الفارغ، أو /0.
هذا، بالطبع، يساوي /0،
لذا يتوقف التكرار الحلقي،
تاركًا العدد الإجمالي
أو قيمة n كما كانت عليه،
والذي كان 6.
إذًا هذا هو الأمر.
مثل جميع ما هو غير
ظاهر، كل ما لدينا
هو ذاكرة موضوعة مثل هذا،
من الأعلى للأسفل، اليسار لليمين

English: 
and yet all of the functionality
we've been using for a week now
and henceforth just boils down to
some relatively simple primitives,
and if you understand
those primitives, you
can do anything you want using
the computer, both computationally
code-wise, but also memory-wise.
We can actually see, in fact, some of
the stuff we looked at two weeks ago as
follows.
Let me go ahead and open up
an example called ASCII 0.
Recall that ASCII is the mapping between
letters and numbers in a computer.
And notice what this
program's going to do.
Make-- let me go into this folder.
Make ascii0, ./ascii0, Enter.
The string shall be,
let's say, Zamyla, Enter.
Well, it turns out that
if you actually look up
the ASCII code for Zamyla's name, z
is 90, lowercase a is 97, m is 109,
and so forth.
There are those characters,
and actually, we
can play the same game we did last week.
If I do this again on "hi," there's
your 72, and there's your 73.
Where is this coming from?
Well, now that I know how to
manipulate individual strings,
notice what I can do.

Arabic: 
ومع ذلك كل وظيفتها التي تم
استخدامها لمدة أسبوع من الآن
فصاعدًا يتلخص في بعض
البدائيات البسيطة نسبيًا،
وإذا فهمت هذه البدائيات، فيمكنك
القيام بأي شيء تريده باستخدام
الكمبيوتر بكل من الطريقة الحسابية
وفيما يتعلق بالتعليمات البرمجية،
وأيضًا فيما يتعلق بالذاكرة.
يمكننا بالفعل رؤية، في الواقع، بعض الأشياء
التي نظرنا إليها في الإسبوعين الماضيين
كما يلي.
اسمحوا لي بالمضي قدمًا
وفتح مثال يسمى ASCII 0.
تذكروا أن ASCII يقوم بالربط بين
الأحرف والأرقام في الكمبيوتر.
ولاحظوا ما الذي
سيفعله هذا البرنامج.
Make-- دعوني أفتح هذا المجلد.
Make ascii0، ./ascii0، Enter.
يجب أن تكون السلسلة،
دعونا نقول، Zamyla، Enter.
حسنًا، اتضح أنك
إذا كنت تبحث عن
رمز ASCII لاسم Zamyla، سيكون z هو 90،
والحرف الصغير a هو 97، وm هو 109،
وهكذا.
توجد تلك الأحرف
وفي الواقع، يمكننا
لعب اللعبة نفسها التي قمنا بها الأسبوع الماضي.
إذا قمت بذلك مجددًا على "hi،"
فيوجد 72 الخاص بك، ويوجد 73 الخاص بك.
من أين يأتي هذا؟
حسنًا، الآن أعرف كيفية
معالجة السلاسل الفردية،
لاحظوا ما الذي يمكنني فعله.

Arabic: 
يمكنني الحصول على سلسلة من
المستخدم، تمامًا كما يمكننا دومًا.
يمكنني التكرار على طول
تلك السلسلة، وإن كان بشكل غير فعال
باستخدام strlen هنا.
ثم لاحظوا هذه الميزة الجديدة اليوم.
يمكنني الآن تحويل نوع بيانات واحد
إلى آخر، لأن char،
حرف هو فقط ثماني وحدات بت، ولكنه
يقدم في سياق الأحرف.
كما أن وحدات البت هي فقط ثماني وحدات بت يمكنك
معاملتها كعدد صحيح، رقم.
إنها حساسة للسياق تمامًا.
إذا قمت باستخدام برنامج Photoshop، فستكون رسمًا.
إذا قمت باستخدام برنامج نصي،
فستكون رسالة وهكذا.
لذا يمكنك ترميز--
تغيير السياق.
لذا لاحظوا هنا، s قوس i هي، بالطبع،
حرف i-th من اسم Zamyla
لذا Z أو A أو M أو أيًا كان.
ولكن يمكنني تحويل حرف i إلى
عدد صحيح بالقيام بما يسمى الصب.
يمكن حرفيًا، في ما بين الأقواس،
تحديد نوع البيانات
التي ترغب في تحويل نوع
بيانات واحد إليها، ثم
تخزينه في نوع البيانات هذا بالضبط.
لذا s قوس i-- حوله إلى رقم.
ثم خزنه في متغير رقم حقيقي،
حتى يمكنني طباعة قيمته.

English: 
I can get a string from the
user, just as we always have.
I can iterate over the length of
that string, albeit inefficiently
using strlen here.
And then notice this new feature today.
I can now convert one data type
to another, because a char,
a character is just eight bits, but
presented in the context of characters.
Bytes is also just eight bits that you
could treat as an integer, a number.
It's totally context-sensitive.
If you use Photoshop, it's a graphic.
If you use a text program,
it's a message and so forth.
So you can encode--
change the context.
So notice here, s bracket i is, of
course, the i-th character of Zamyla's
name, so Z or A or M or whatever.
But I can convert that i-th character to
an integer doing what's called casting.
You can literally, in
parentheses, specify the data type
you want to convert one
data type to, and then
store it in exactly that data type.
So s bracket i-- convert it to a number.
Then store it in an actual number
variable, so I can print out its value.

Arabic: 
إذًا لغة c-- تعرض لي هذا الحرف.
تعرض لي الحرف كما هو متصل
بالحرف، ومن ثم الحرف--
عفوًا، الحرف والرقم
الذي قمت للتو بتحويله إليه.
ولا يتوجب عليك فعليًا
أن تكون صريحًا.
هذا ما يسمى بالصب الصريح.
فنيًا، يمكننا القيام
بهذا بشكل ضمني، أيضًا.
ويعرف جهاز الكمبيوتر أن
الأرقام هي أحرف،
والأحرف هي رقم.
لا يتوجب عليك أن تدقق
كثيرًا وتقوم
بالصب الصريح في الأقواس.
يمكنك القيام به فقط باستخدام أنواع
البيانات، وبصراحة في هذه النقطة،
أنا لا أحتاج إلى المتغير.
يمكنني التخلص منه، وهنا في الأسفل،
يمكنني حرفيًا
طباعة الشيء نفسه مرتين،
ولكن أخبر printf
أن يقوم بطباعة الأول في
سياق حرف
والثاني في سياق عدد صحيح،
فقط بالتعامل مع وحدات البت نفسها بالضبط
بشكل مختلف.
هذا هو الصب الضمني.
ويظهر فقط
ما قمنا به في أسبوع 0
عندما زعمنا أن
الأحرف هي أرقام،
والأرقام يمكن أن تكون ألوانًا، والألوان
يمكن أن تكون صورًا، وهكذا.
هل هذا سؤال؟
الجمهور: هل كانت ستكون
مفيدة بالنسبة للائتمان.
ديفيد ج. مالان: أيضًا، نعم.
إن الأمر كله يعتمد على الائتمان.
نعم.

English: 
So c-- this is show me the character.
Show me the letter as by plugging in
the character, and then the letter--
sorry, the character and the number
that I've just converted it to.
And you don't actually
even have to be explicit.
This is called explicit casting.
Technically, we can do
this implicitly, too.
And the computer knows that
numbers are characters,
and characters are a number.
You don't have to be
so pedantic and even do
the explicit casting in parentheses.
You can just do it implicitly with data
types, and honestly, at this point,
I don't even need the variable.
I can get rid of this, and
down here, I can literally just
print the same thing
twice, but tell printf
to print the first in the
context of a character
and the second in the context of an
int, just treating the exact same bits
differently.
That's implicit casting.
And it just demonstrates
what we did in week 0
when we claimed that
letters are numbers,
and numbers can also be colors, and
colors can be images, and so forth.
Is this a question?
AUDIENCE: Would've
been useful for credit.
DAVID J. MALAN: Also, yes.
It all comes back to credit.
Yeah.

English: 
Indeed.
Other questions?
No.
All right, so what else can we
actually do with this appreciation?
So super simple feature that all
of us surely take for granted,
if we even use it anymore these days.
Google Docs, Microsoft Word,
and such can automatically
capitalize words for you these days.
I mean your phone can do it nowadays.
They just sort of
AutoCorrect your messages.
Well, how is that actually working?
Well, once you know that a string
is just a bunch of characters
back to back to back, and you know
that these characters have numbers
representing them, and like capital A is
65, and lowercase A is 97, apparently,
and so forth, we can
leverage these patterns.
If I go ahead and open
up this other example
here called Capitalize 0,
notice what this program is
going to do for me first by running it.
Make capitalize 0 ./capitalize0.
Let me go ahead and type in Zamyla's
name just as before, but now
it's all capital.
So this is a little extreme.
Hopefully, your phone is not
capitalizing every letter,
but you can imagine it capitalizing
just the first, if you wanted it.
So how does this work?

Arabic: 
حقًا.
أي أسئلة أخرى؟
لا.
حسنًا، إذًا ما الذي يمكننا
القيام به في الواقع بهذا التقدير؟
ميزة بسيطة جدًا
نعتبرها جميعًا أمرًا مسلمًا به،
إذا كنا نستخدمها بعد هذه الأيام.
يمكن لـ Google Docs، وMicrosoft Word،
وما يماثلهما
كتابة كلمات بأحرف كبيرة تلقائيًا لك هذه الأيام.
أعني أن هاتفك يمكنه القيام بذلك الآن.
إنها فقط عبارة عن نوع من
التصحيح التلقائي لرسائلك.
حسنًا، كيف يعمل هذا فعليًا؟
حسنًا، بمجرد أن تعرف أن السلسلة
عبارة عن مجموعة من الأحرف فقط
متصلة على التوالي مع بعضها البعض، وتعرف أن
هذه الأحرف لديها أرقام
تمثلها، ومثل الحرف الكبير A هو 65،
والحرف الصغير A هو 97، بشكل واضح،
وهكذا، يمكننا الحصول على
هذه الأنماط.
إذا مضيت قدمًا وفتحت
المثال الآخر هذا
هنا المسمى بـ Capitalize 0،
لاحظوا ما الذي سيقوم به هذا البرنامج
لي أولاً بتشغيله.
Make capitalize 0 ./capitalize0.
دعوني أمضي قدمًا وأكتب اسم Zamyla
فقط كما فعلت من قبل، ولكن الآن
بجعل جميع الأحرف كبيرة.
لذا هذا زائد قليلاً.
آمل أن هاتفك لا يكتب
كل حرف بالأحرف الكبيرة،
ولكن يمكنك تخيله يكتب الحرف الأول فقط،
إذا رغبت في ذلك.
لذا كيف يتم هذا؟

Arabic: 
حسنًا، دعوني أمضي قدمًا وأفتح
هذا المثال هنا.
وهذا ما قمنا به--
هنا، أحصل على سلسلة من
المستخدم، تمامًا كما نفعل دائمًا.
ثم فقط أقول، after، لتنسيق
المخرج بشكل لطيف نوعًا ما.
هنا، أقوم بتكرار حلقي بكفاءة
جيدة من i يعادل 0 إلى ما يصل
إلى طول السلسلة.
والآن لاحظوا تطبيق المنطق
الأنيق هذا.
إنه مشفر قليلاً،
للوهلة الأولى.
ولكن عفوًا.
والآن لقد اختفى.
وما الذي أقوم به بالضبط
باستخدام سطور التعليمات البرمجية هذه؟
حسنًا، بكل عملية تكرار لهذا التكرار الحلقي،
سأطرح السؤال،
هل الحرف i من s،
لذا الحرف الحالي،
أكبر من أو يعادل
الحرف الصغير A، وأقل من
أو يعادل الحرف الصغير Z؟
وبعبارة أخرى، كيف يمكنك قول ذلك
بتعبير عامي أكثر باللغة الإنجليزية؟
هل هو حرف صغير، حرفيًا.
ولكن هذه هي الطريقة الأكثر برمجية للتعبير،
هل هو حرف صغير؟
حسنًا، إذا كان كذلك،
فلتمضي قدمًا وتقوم بذلك.
الآن هذا غريب قليلاً، ولكن اطبع
حرفًا، على وجه التحديد،
الحرف i، ولكن اطرح
من ذلك الحرف الصغير حرفًا أيًا كان

English: 
Well, let me go ahead and
open up this example here.
And so what we did--
so here, I'm getting a string from
the user, just as we always do.
Then I'm saying, after, just to
kind of format the output nicely.
Here, I'm doing a loop pretty
efficiently from i equals 0 up
to the length of the string.
And now notice this neat
application of logic.
It's a little cryptic,
certainly, at first glance.
But whoops.
And now it's gone.
And what am I doing exactly
with these lines of code?
Well, with every iteration of this
loop, I'm asking the question,
is the i-th character of s,
so the current character,
is it greater than or equal to
lowercase A, and is it less than
or equal to lowercase Z?
Put another way, how do you say
that more colloquially in English?
Is it lowercase, literally.
But this is the more programmatic
way of expressing, is it lowercase?
All right, if it is,
go ahead and do this.
Now this is a little funky, but
print out a character, specifically
the i-th character, but subtract
from that lowercase letter whatever

Arabic: 
الاختلاف بين الحرف الصغير A
والحرف الكبير A. الآن من أين أتى ذلك؟
إذًا يتضح أن--
حسنًا، الحرف الكبير A هو 65.
الحرف الصغير A هو 97.
لذا الفرق بين هذين الحرفين هو 32.
وهذا صحيح لـ B، لذا الحرف الكبير
B هو 66، والحرف الصغير B هو 98.
وما زال 32، ويتكرر
للأحرف الأبجدية بأكملها.
لذا يمكنني فقط القيام بهذا.
إذا علمت أن الأحرف الصغيرة
لديها أرقام كبيرة، مثل 97، 98،
وأعرف أن الأرقام الصغيرة
لديها أحرف صغيرة، مثل 65، 66،
يمكنني فقط حرفيًا طرح
32 من الأحرف الصغيرة الخاصة بي.
كما أشرتم،
إنه حرف صغير.
اطرح 32، ويعطينا
هذا أي نتيجة؟
الإصدار المكتوب بأحرف كبيرة.
إنها تقوم بتكبير الأشياء من أجلنا.
ولكن بصراحة، إن هذا يبدو
نوعًا من الاختراق، مثل، حسنًا، نعم،
يمكنني القيام بعملية حسابية بشكل صحيح،
ولكن أتعرفون؟
إنها ممارسة أفضل، بشكل عام،
للطرح بهذه الطريقة.
لا تدخلوا في تعقيدات حساب
عدد الأحرف التي تفصلهم
عن بعضها البعض.
الحساب أمر سهل وبسيط على جهاز الكمبيوتر.
فلتدعه يقوم بالعملية الحسابية لأجلك
من خلال طرح قيمة الحرف الكبير A،

English: 
the difference is between little A and
big A. Now where did that come from?
So it turns out--
OK, capital A is 65.
Lowercase A is 97.
So the difference between those is 32.
And that's true for B, so capital
B is 66, and lowercase B is 98.
Still 32, and it repeats
for the whole alphabet.
So I could just do this.
If I know that lowercase letters
have bigger numbers, like 97, 98,
and I know that lowercase numbers
have lower letters, like 65, 66,
I can just literally subtract
off 32 from my lowercase letters.
As you point out, it's
a lowercase letter.
Subtract 32, and that
gives us what result?
The capitalized version.
It uppercases things for us.
But honestly, this feels a little
hackish that, like, OK, yes,
I can do the math correctly,
but you know what?
It's better practice, generally,
to abstract this away.
Don't get into the weeds of counting
how many characters are away
from each other.
Math is cheap and easy in the computer.
Let it do the math for you by
subtracting whatever the value of A

Arabic: 
أيًا كانت من قيمة الحرف
الصغير A. أو يمكننا فقط كتابة 32.
وإلا أمضي قدمًا وقم فقط
بطباعة الحرف الذي لم يتغير.
لذا في هذه الحالة، تم تكبير الأحرف A-M-Y-L-A
في اسم Zamyla،
وكل شيء آخر،
وتم ترك الحرف Z بمفرده،
فقط من خلال فهم ما الذي يجري
باستخدام الكيفية التي يتم تقديم جهاز الكمبيوتر بها.
ولكن بصراحة، لا أريد
أن أستمر في كتابة تعليمة برمجية كهذه.
مثل، لن أحصل على هذا أبدًا.
أنا جديد في عالم البرمجة، من المحتمل.
لن أحصل أبدًا على هذا النوع من التسلسل
لجميع الرموز المشفرة
معًا، وهذا جيد، لأنه يمكننا تنفيذ
هذا البرنامج نفسه
بشكل أكثر سهولة قليلاً،
بفضل الدوال
وعمليات التجريد
التي كتبها الآخرون من أجلنا.
لذا في هذا البرنامج،
اتضح أنه يمكنني تبسيط
الأسئلة التي سأطرحها من خلال حرفيًا
طلب دالة تقول، أقل من.
وتوجد دالة أخرى تسمى،
is upper،
وتوجد مجموعة أخرى
والتي تسمى حرفيًا،
بشيء آخر أو غير ذلك.
لذا is lower تأخذ وسيطة
مثل الحرف i من s،
ولا ترجع شيئًا--
صحيح أو خاطئ فقط.
كيف يتم تنفيذ ذلك؟

English: 
is, of capital A is from the value of
lowercase A. Or we could just write 32.
Otherwise, go ahead and just
print the character unchanged.
So in this case, the A-M-Y-L-A
in Zamyla's name got uppercased,
and everything else,
the Z, got left alone,
just by understanding what's going on
with how the computer's represented.
But honestly, God, I don't want
to keep writing code like this.
Like, I'm never going to get this.
I'm new to programming, perhaps.
I'm never going to get this sort of
sequence of all the cryptic symbols
together, and that's OK, because we can
actually implement this same program
a little more easily,
thanks to functions
and abstractions that
others have written for us.
So in this program,
turns out I can simplify
the questions I'm asking by literally
calling a function that says, is lower.
And there's another
one called, is upper,
and there's bunches of others
that just literally are called,
is something or other.
So is lower takes an argument
like the i-th character of s,
and it just returns a
bull-- true or false.
How is it implemented?

English: 
Well, honestly, if we looked at the
code that someone else wrote decades ago
for is upper, odds are-- or is lower--
odds are he or she wrote code
that looks almost like this.
But we don't need to worry
about that level of detail.
We can just use his or her
function, but how do we do that?
Turns out that this function--
and you would only know this
by having been told or Googling
or reading a reference--
is in a library called ctype.h.
And you need the header file
called ctype.h in order to use it.
And we'll almost always point you
to references and documentation
to explain that to you.
Toupper is another feature, right?
This math-- like, my god.
I just want to uppercase a letter.
I don't want to really keep thinking
about how far apart uppercase letters
are from lowercase.
Turns out that in the
C type library, there's
another function called toupper that
literally does the exact same thing
in the previous program we wrote.
And so that, too, is OK.
But you know what?
This feels a little verbose.
It would be nice if I could
really tighten this program up.
So how those toupper work?
Well, it turns out some of you might
be familiar with CS50 Reference

Arabic: 
حسنًا، وبصراحة، إذا نظرنا في
التعليمة البرمجية التي كتبها شخص آخر منذ عقود
لـ is upper، فالاحتمالات هي-- أو is lower--
الاحتمالات هي أنه كتب أو أنها كتبت تعليمة برمجية
تشبه هذه كثيرًا.
ولكننا لسنا بحاجة إلى القلق
من هذا المستوى من التفاصيل.
يمكننا استخدام دالته أو دالتها فقط،
ولكن كيف يمكننا القيام بذلك؟
اتضح أن هذه الدالة--
ويمكنك معرفة هذا فقط
عن طريق إخبارك أو البحث عنه في Google
أو قراءة مرجع--
موجودة في مكتبة باسم ctype.h.
وتحتاج إلى ملف الرأس
المسمى ctype.h لكي تستخدمه.
وسنقوم دائمًا تقريبًا بتوجيهك
إلى مراجع ووثائق
لتوضيح ذلك لك.
To upper هي ميزة أخرى، أليس كذلك؟
هذه الحسابات-- مثل، يا إلهي.
أريد فقط كتابة حرف كبير.
أنا لا أريد أن أستمر في التفكير حقًا
حول إلى أي مدى الفرق بين الأحرف الكبيرة
والأحرف الصغيرة.
اتضح أن في مكتبة
من النوع C، توجد
دالة أخرى تسمى toupper
والتي تقوم حرفيًا بالشيء نفسه بالضبط
في البرنامج السابق الذي كتبناه.
ولذا هذا، أيضًا، جيد.
ولكن أتدرون ماذا؟
يبدو هذا أكثر إطنابًا قليلاً.
سيكون من الجيد إذا تمكنت حقًا من
ربط هذا البرنامج.
لذا كيف تعمل toupper هذه؟
حسنًا، يتضح أن البعض منكم
أصبح على دراية بمرجع CS50

Arabic: 
على الإنترنت، تطبيقنا القائم على الويب
والذي لدينا
لمساعدتكم في التنقل
بين الوظائف المتاحة في C.
يتضح أن جميع البيانات
لذلك التطبيق
تأتي من برنامج سطر أوامر
قديم يأتي في Linux
ويأتي في أداة تحديد الوصول
التي تسمى Man لدليل.
وفي أي وقت تكتب فيه "man" في
محث الأوامر، ومن ثم اسم
دالة أنت مهتم
بها، إذا وجدت،
ستخبرك شيئًا بسيطًا
حيال ذلك.
لذا إذا انتقلت إلى toupper ،man toupper
سأحصل على وثائق مشفرة قليلاً
هنا.
ولكن لاحظوا أن toupper
وبعض الدوال الأخرى
تحول حرف صغير أو حرف كبير.
هذا هو الملخص.
لاحظوا أنه في الملخص الموجز، صفحة man،
إذا جاز التعبير،
تخبرني أي ملف
رأس يتوجب عليّ تضمينه.
لاحظوا أنه أسفل الملخص الموجز،
تخبرني أيضًا
بأي توقيع أو
نموذج أولي للدالة.
وبعبارة أخرى، الوثائق في Man،
دليل المبرمجين من Linux،
موجزة للغاية.
لذا فهي لن تحتفظ بيدك في تنسيق
الأبيض والأسود هذا.
إنها فقط ستقوم
بتحويلك، حسنًا، بشكل ضمني،
إلى الأفضل بوضع هذا في أعلى ملفك.
وبالمناسبة، هذه هي
كيفية استخدامك للدالة.

English: 
Online, our web-based
app that we have that
helps you navigate
available functions in C.
Turns out that all of the
data for that application
comes from an older command
line program that comes in Linux
and comes in the sandbox
called Man for manual.
And anytime you type "man" at the
command prompt, and then the name
of a function you're
interested in, if it exists,
it will tell you a little
something about it.
So if I go to toupper, man toupper,
I get slightly cryptic documentation
here.
But notice, toupper and
some other functions
convert uppercase or lowercase.
That's the summary.
Notice that in the synopsis,
the man page, so to speak,
is telling me what header
file I have to include.
Notice that under Synopsis,
it's also telling me
what the signature or
prototype is of the function.
In other words, the documentation in
Man, the Linux programmer's manual,
is very terse.
So it's not going to hold your hand
in this black and white format.
It's just going to
convey, well, implicitly,
you better put this on top of your file.
And by the way, this is
how you use the function.

Arabic: 
إنها تأخذ وسيطة تسمى C،
وتعيد قيمة من النوع int.
لماذا هذا int؟
دعونا لا نلقي بالاً لهذا.
إنها تعيد
حرفًا لأغراضنا اليوم.
وإذا انتقلنا إلى الأسفل، حسنًا، وصف.
آه، أنا حقًا لا أريد
قراءة كل هذا، ولكن حسنًا، ها نحن ذا.
إذا كان c حرفًا صغيرًا، فتعيد toupper
مكافئًا كبيرًا له،
إذا وجد تمثيل حرف كبير
في الإعدادات المحلية الحالية.
فهذا يعني فقط إذا كان ترقيمًا،
أنه لن يقوم بأي شيء.
وإلا فسيعيد C،
وهذا نوع من التفاصيل الرئيسية.
إذا قمت بتمرير الحرف الصغير a إليه،
فسيقدم لي الحرف الكبير A،
ولكن إذا قمت بتمرير الحرف الكبير A،
فما الذي سيقدمه لي؟
الجمهور: الحرف الكبير A.
ديفيد ج. مالان: أيضًا، الحرف الكبير A. تعيد
الحرف الأصلي، c.
هذا هو التفصيل الوحيد الذي أهتم به.
في حالة الشك، اقرأ الدليل.
وقد يكون
مشفرًا قليلاً، وهذا
هو السبب وراء أخذ مرجع CS50
وثائق مشفرة إلى حد ما
ومحاولته تبسيطها في
مصطلحات ملائمة أكثر للإنسان.
ولكن في نهاية اليوم، هذه
هي الإجابات الموثوقة.
وإذا كنت لا أعرف أنا أو أحد العاملين،
فنحن حرفيًا
نسحب صفحة Man أو مرجع CS50
للإجابة على هذه الأنواع من الأسئلة.

English: 
It takes an argument called C,
returns a value of type int.
Why is it int?
Let me wave my hands at that.
It effectively returns a
character for our purposes today.
And if we scroll down, OK, description.
Ugh, I don't really want to read
all of this, but OK, here we go.
If c is a lowercase letter, toupper
returns its uppercase equivalent,
if an uppercase representation
exists in the current locale.
That just means if it's punctuation,
it's not going to do anything.
Otherwise, it returns C, And
that's kind of the key detail.
If I pass it lowercase A, it's
going to give me capital A,
but if I pass it capital A,
what's it going to give me?
AUDIENCE: Capital A.
DAVID J. MALAN: Also, capital A. It
returns the original character, c.
That's the only detail I cared about.
When in doubt, read the manual.
And it might be a
little cryptic, and this
is why CS50 Reference takes
somewhat cryptic documentation
and tries to simplify it into
more human-friendly terms.
But at the end of the day, these
are the authoritative answers.
And if I or one of the staff
don't know, we literally
pull up the Man page or CS50 Reference
to answer these kinds of questions.

English: 
Now what's the implication?
I don't need any of this.
I can literally get rid of
the condition and just let
toupper do all of the
legwork, and now my program
is so much more compact than
the previous versions were,
because I've read the documentation.
I know what the function does, and I
can let toupper uppercase something
or just pass it through unchanged.
We can better design, because we're
writing fewer lines of code that
are just as clear, and so we can
now actually tighten things up.
Any questions on this
particular approach?
All right.
So we're getting very low level.
Now let's make these things more
useful, because clearly, other people
have solved some of
these problems for us,
as by having these functions and the
C type library and the string library.
What more is there?
Well, recall that every time
we run Clang, or even run make,
we're typing multiple words
at the command prompt.
You're typing make hello or
make Mario, a second word,
or you're typing
clang-o, hello, hello.c,

Arabic: 
الآن ما هو الأثر؟
لا أحتاج أيًا من هذه.
يمكنني حرفيًا التخلص من
الشرط وأسمح فقط
لـ toupper القيام بكل
العمل الشاق، والآن برنامجي
أصبح مضغوطًا أكثر مما كانت عليه
الإصدارات السابقة
لأنني قرأت الوثائق.
أنا اعرف ما الذي تقوم به الدالة، ويمكنني
السماح لـ toupper بتكبير شيء
أو تمريره فقط بدون تغيير.
يمكننا التصميم بشكل أفضل، لأننا
كتبنا بعض سطور التعليمات البرمجية
الواضحة تمامًا، ولذا يمكننا الآن
ربط الأشياء.
أي أسئلة حول هذا
النهج المعين؟
حسنًا.
لذا نحصل على مستوى منخفض جدًا.
الآن دعونا نجعل هذه الأشياء
مفيدة أكثر، لأنه وبشكل واضح، قام أشخاص آخرون
بحل بعض
المشكلات هذه لأجلنا،
من خلال وجود هذه الدوال والمكتبة من النوع
C ومكتبة السلسلة.
ما الذي يوجد هناك أكثر؟
حسنًا، تذكروا ذلك كل مرة
نقوم فيها بتشغيل Clang، أو حتى نقوم بتشغيل make،
نكتب كلمات متعددة
في محث الأوامر.
أنت تكتب make hello
أو make Mario، كلمة ثانية،
أو تكتب
clang-o، hello، hello.c،

Arabic: 
العديد من الكلمات في المحث.
حسنًا، يتضح أن طوال
هذا الوقت، أنت تستخدم، حقًا،
وسيطات سطر الأوامر.
ولكن في C، يمكنك كتابة برامج
تقبل أيضًا كلمات وأرقام عندما
يشغّل المستخدم البرنامج.
فكر مجددًا، بعد كل هذا.
عندما قمت بتشغيل Mario،
فأنت قمت بـ ./mario، Enter.
لم يمكنك كتابة أي
كلمات أكثر في المحث.
عندما قمت بالائتمان،
فأنت قمت بـ ./credit، Enter.
لا توجد كلمات أخرى في المحث.
لقد استخدمت get string أو
get more input، ولكن ليس
في سطر الأوامر.
ويتضح أنه يمكننا، ببساطة نسبيًا،
في C،
ولكن هذا مشفر قليلاً
للوهلة الأولى.
دعوني أمضي قدمًا--
دعوني أمضي قدمًا، هنا، وأسحب هذا التوقيع هنا،
والذي يشبه هذا.
هذه هي الدالة التي قمنا باستخدامها جميعًا
حتى الآن لكتابة دالة رئيسية.
وحتى الآن، لقد قلنا void.
ولا يأخذ Main أي مخرج،
وحقًا إنها فقط تقوم بالتشغيل.
ولكن يتضح أنه إذا قمت بتغيير
برامجك الموجودة أو برامجك المستقبلية،
ليس بقول void، ولكن بقول
int argc، string argv،

English: 
like lots of words at the prompt.
Well, it turns out that all
this time, you're using, indeed,
command line arguments.
But in C, you can write programs that
also accept words and numbers when
the user runs the program.
Think back, after all.
When you ran Mario,
you did ./mario, Enter.
You couldn't type any
more words at the prompt.
When you did credit,
you did ./credit, Enter.
No more words at the prompt.
You used get string or get
long to get more input, but not
at the command line.
And it turns out that we
can, relatively simply, in C,
but it's a little
cryptic at first glance.
Let me go ahead and--
let me go ahead and, here, pull up this
signature here, which looks like this.
This is the function that we're all used
to by now for writing a main function.
And up until now, we've said void.
Main doesn't take any inputs,
and indeed, it just runs.
But it turns out if you change your
existing programs or future programs,
not to say void, but to
say, int argc, string argv,

English: 
it's a little cryptic at first glance.
But what's a recognizable symbol now?
Yeah, there's brackets here.
So it turns out that every
time you write a program,
if you don't just say void, you
actually enable this feature
by writing int argc, string argv.
You can actually tell
Clang, you know what?
I want this program to accept one or
more words or numbers after the name
of the program, so I can do
./hellodavid, or ./hellozamyla.
I don't have to wait for the
program to be running to use string.
And just as with the earlier example,
where you were able to chart an array,
main is defined as taking an array,
called argv historical reasons--
argument vector.
Vector means array.
Argument vector, bracket, closed
bracket just means this is--
this contains one or more words,
each of which is a string.
Argc is argument count,
so this is the variable
that main gets access to that
tells it how many arguments,
how many strings are actually in argv.
So how can we use this in a useful way?

Arabic: 
إنه مشفر قليلاً للوهلة الأولى.
ولكن ما هو الرمز الذي يمكن التعرف عليه الآن؟
نعم، توجد أقواس هنا.
لذا يتضح أن كل مرة
تكتب فيها برنامجًا،
إذا لم تقل void فقط،
فأنت تمكّن هذه الميزة في الواقع
من خلال كتابة int argc، string argv.
يمكنك إخبار Clang،
أتعرفون ماذا؟
أريد هذا البرنامج أن يقبل كلمة واحدة
أو أكثر أو رقمًا واحدًا أو أكثر بعد اسم
البرنامج، إذًا يمكنني القيام بـ
./hellodavid، أو ./hellozamyla.
لا أحتاج إلى انتظار البرنامج
ليتم تشغيله لاستخدام سلسلة.
ومثلما هو الحال في المثال السابق،
حيث كان يمكنك رسم مصفوفة،
يتم تحديد main بأخذ مصفوفة،
تسمى argv لأسباب تاريخية--
وسيطة vector.
Vector يعني مصفوفة.
تعني وسيطة vector، قوس،
قوس مغلق فقط هذا هو--
يحتوي هذا على كلمة واحدة أو
أكثر، كل منها سلسلة.
Argc هو عدد الوسيطات،
لذا هذا هو المتغير
حيث يصل main إلى ذلك
ليخبره عن عدد الوسيطات،
عدد السلاسل الموجود بالفعل في argv.
لذا كيف يمكننا استخدام هذا بطريقة مفيدة؟

Arabic: 
حسنًا، دعوني أمضي
قدمًا وأفتح أداة تحديد الوصول.
ودعوني أمضي قدمًا وأقوم بإنشاء ملف
جديد باسم، لنقل، argv0، argv0.c--
مجددًا، وسيطة vector، فقط
قائمة أو مصفوفة من الوسيطات.
ودعوني أمضي قدمًا، وكما هو معتاد،
include cs50.h، include stdio.h،
ومن ثم int main ليس void،
ولكن int argc، string argv--
argv-- فتح قوس، قوس مغلق.
وحتى إذا لم يظهر
بشكل عادي في البداية، فستصبح هكذا في النهاية.
سأقوم بفعل ذلك.
إذا كان عدد الوسيطات
التي تم تمريرها يساوي 2،
ثم أقوم بالمضي قدمًا وأفعل
هذا-- printf، مرحبًا %s، فاصلة،
وهنا من قبل، قمت
بكتابة اسم متغير.
ويمكنني الآن الوصول
إلى متغير.
أمضي قدمًا وأكتب argv قوس 1.
Else، إذا لم يقم المستخدم بكتابة،
على ما يبدو كلمتين،

English: 
Well, let me go ahead here
and open up the sandbox.
And let me go ahead and create a new
file called, say, argv0, argv0.c--
again, argument vector, just
list or array of arguments.
And let me go ahead and, as usual,
include cs50.h, include stdio.h,
and then int main not void,
but int argc, string argv--
argv-- open bracket, closed bracket.
And even if that doesn't come
naturally at first, it will eventually.
And I'm going to do this.
If the number of arguments
passed in equals 2,
then I'm going to go ahead and do
this-- printf, hello %s, comma,
and here in the past, I've
typed a variable name.
And I now actually have
access to a variable.
Go ahead and do argv bracket 1.
Else, if the user does not
type, apparently, two words,

Arabic: 
دعوني أمضي قدمًا وفقط بشكل افتراضي، أقول،
hello world، كما نفعل دائمًا.
الآن لماذا-- ما الذي يقوم به هذا،
وكيف يقوم بذلك؟
حسنًا، فلنشغله بسرعة.
لذا make-- أوه.
Make argv0, ./argv0, Enter, Hello World.
ولكن إذا كتبت Hello--
أو نقطة-- سيكون اسم البرنامج
بشكل أفضل
إذا أطلقنا عليه Hello،
ولكن Zamyla، Enter.
Hello Zamyla.
إذا قمت بتغييره إلى ديفيد،
الآن يمكنني الوصول إلى ديفيد.
إذا كان لدي ديفيد مالان، لا.
إنه لا يدعم ذلك.
إذًا ما الذي يحدث؟
إذا قمت بتغيير main في
أي برنامج للكتابة لتأخذ
هاتين الوسيطتين، argc وargv
من النوع string int
ومن ثم مصفوفة السلاسل،
تخبرك argc عدد الكلمات
المكتوبة في المحث.
لذا إذا كتب شخص
كلمتين، أفترض أن
الكلمة الأولى هي اسم
البرنامج، نقطة خط مائل argv0،
والكلمة الثانية من المفترض أن تكون
اسمي، إذا كان يقدم أو كانت تقدم في الواقع
اسمه أو اسمها في المحث.
ولذا طبعت argv قوس 1.
ليس 0 لأن هذا هو اسم
البرنامج، ولكن argv قوس 1.

English: 
let me go ahead and just by default,
say, hello world, as we always have.
Now why-- what is this doing,
and how is it doing it?
Well, let's quickly run it.
So make-- whoops.
Make argv0, ./argv0, Enter, Hello World.
But if I do Hello--
or dot-- the program
would be better named
if we called it Hello,
but Zamyla, Enter.
Hello Zamyla.
If I change it to David,
now I have access to David.
If I had David Malan, no.
It doesn't support that.
So what's going on?
If you change main in
any program write to take
these two arguments, argc
and argv of type string int
and then an array of strings,
argc tells you how many words
were typed at the prompt.
So if the human typed
two words, I presume
the first word is the name of
the program, dot slash argv0,
the second word is presumably my
name, if he or she is actually
providing their name at the prompt.
And so I print out argv bracket 1.
Not 0 because that's the name of
the program, but argv bracket 1.

English: 
Else, down here, if the human doesn't
provide just Zamyla, or just David,
or just one word more generally, I
just print the default, "Hello world."
But what's neat about this now is
notice that argv is an array of strings.
What is a string?
It's an array of characters.
And so let's enter just one last piece
of syntax that gets kind of powerful
here.
Let me go ahead and do this.
Let me go ahead and, in a
new file here, argv 1 dot c.
Let me go ahead and paste this in.
Close this.
Let me go ahead and do this.
Rather than do this logical
checking, let me do this, for--
let's say for int, i get 0.
i is less than argc--
i++.
Let's go ahead and, one per
line, print out every word
that the human just
typed, just to reinforce
that this is indeed what's going on.

Arabic: 
Else، في الأسفل هنا، إذا لم يقدم الشخص
فقط Zamyla، أو ديفيد فقط،
أو كلمة واحدة فقط بشكل عام أكثر،
فأنا أطبع الافتراضي فقط، "Hello world."
لكن الأنيق حول هذا الآن هو
لاحظوا أن argv هي مصفوفة السلاسل.
ما هي سلسلة؟
إنها مصفوفة من الأحرف.
ولذا دعونا ندخل قطعة واحدة أخرى من
الصيغة التي تصبح أقوى نوعًا ما
هنا.
دعوني أمضي قدمًا وأفعل هذا.
دعوني أمضي قدمًا، وفي ملف جديد
هنا، argv 1.c.
دعوني أمضي قدمًا وألصق هذا.
أغلق هذا.
دعوني أمضي قدمًا وأفعل هذا.
وبدلاً من القيام بهذا التدقيق المنطقي،
دعوني أقوم بهذا، لـ--
دعونا نقول for int, i get 0.
i أقل من argc--
i++.
دعونا نمضي قدمًا، واحد في كل سطر،
ونطبع كل كلمة
كتبها شخص فقط،
فقط لتأكيد
أن هذا هو ما يحدث حقًا.

Arabic: 
لذا argv قوس 0، حفظ.
Make argv 1، enter.
والآن دعوني أمضي قدمًا
وأشغل هذا البرنامج--
نقطة خط مائل، argv 1، ديفيد مالان.
حسنًا، ترون جميع الكلمات الثلاث.
إذا قمنا بتغييرها إلى Zamyla،
سنرى هاتين الكلمتين فقط.
إذا قمنا بتغييرها إلى Zamyla Chan،
سنرى الكلمات الثلاث هذه.
لذا من الواضح أننا لدينا إمكانية الوصول إلى
جميع الكلمات في المصفوفة،
ولكن دعونا نأخذ هذه الخطوة الإضافية.
وبدلاً من طباعة كل كلمة فقط
في سلسلة، دعونا نمضي قدمًا ونفعل ذلك.
For intj get 0.
n يعادل طول السلسلة
من الوسيطة الحالية، مثل هذا--
j أقل من n، j++--
أوه، أوه، أوه-- j++.
الآن دعوني أمضي قدمًا ولا أطبع
السلسلة بأكملها، ولكن دعوني أقوم-- أوه،
أوه-- دعوني أمضي قدمًا
وأطبع هذا--

English: 
So argv bracket 0, save.
Make argv 1, enter.
And now let's go ahead
and run this program--
dot slash, argv 1, David Malan.
OK, you see all three words.
If we change it to Zamyla,
we see just those two words.
If we change it to Zamyla
Chan, we see those three words.
So we clearly have access to
all of the words in the array,
but let's take this one step further.
Rather than just print out every word
in a string, let's go ahead and do this.
For intj get 0.
n equals the string length of
the current argument, like this--
j is less than n, j++--
oops, oops, oops-- j++.
Now let me go ahead and print out not
the full string, but let me do-- oops,
oops-- let me go ahead
and print out this--

Arabic: 
ليست سلسلة، ولكن حرف، n
قوس i قوس j، مثل هذا.
حسنًا.
إذًا ما الذي يحدث؟
واحد، هذا تكرار حلقي خارجي، ودعونا نعلق عليه،
التكرار على السلاسل في argv.
هذا تكرار حلقي داخلي، تكرار
على chars في argv قوس i.
لذا التكرار الحلقي الخارجي يتكرر على
جميع السلاسل في argv.
والتكرار الداخلي، باستخدام
متغير مختلف، يبدأ من 0،
يتكرر على جميع
الأحرف في وسيطة i،
والتي هي سلسلة في حد ذاتها.
لذا يمكننا تسميتها بطول السلسلة.
ومن ثم نقوم بهذا حتى n،
وهي طول تلك السلسلة.
ومن ثم نطبع كل حرف.
لذا فقط ليكون الأمر واضحًا-- عندما أقوم بتشغيل
argv1 وأصححه، للوهلة الأولى،
لماذا يعلن بشكل ضمني دالة
المكتبة sterling، ما هو الحل دائمًا
عندما تقوم بهذا الخطأ؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: أجل.
إذًا لقد نسيت هذا،
include string.h وhelp50 قد
يساعد في هذا أيضًا.
لنعيد التحويل البرمجي باستخدام make argv1.
حسنًا.

English: 
not a string, but a character, n
bracket i bracket j, like this.
All right.
So what's going on?
One, this outer loop, and let's comment
it, iterate over strings in argv.
This inner loop, iterate
over chars in argv bracket i.
So the outer loop iterates over
all of the strings in argv.
And the inner loop, using a
different variable, starting at 0,
iterates over all of the
characters in the ith
argument, which itself is a string.
So we can call string length on it.
And then we do this up until n,
which is the length of that string.
And then we print out each character.
So just to be clear-- when I run
arv1 and correct it, at first glance,
why it's implicitly declaring library
function sterling, what's almost always
the solution when you do this wrong?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: Yeah.
So I forgot this, so include
string.h and help50 would
help with that as well.
Let's recompile with make argv1.
All right.

English: 
When I run argv1, of, say, Zamyla
Chan, what am I going to see?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: Yeah.
Is that the right intuition?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: I'm going
to see Zamyla Chan, but--
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: One character on each
line, including the program's name.
So in fact, let me scroll this
up so it's a little bigger.
Enter.
OK, it's a little stupid, the program,
but it does confirm that using arrays
do I have access not only to
the words, but I can kind of
have the second dimension.
And within each word, I can
get at each character within.
And we do this, again, just by using
not just single square brackets,
but double.
And again, just break this
down into the first principles.
What is this first bracket?
This is the ith argument,
the ith string in the array.
And then if you take it
further, with bracket j,
that gives you the j
character inside of this.
Now, who cares about any of
this kind of functionality?
Well, let me scroll back and
propose one application here.
So recall that CS is really
just problem solving.
But suppose the problem
that you want to solve

Arabic: 
عندما أقوم بتشغيل argv1، من،
Zamyla Chan، ما الذي سأقوله؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: أجل.
هل ذلك هو الحدس الصحيح؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: سأنتقل لرؤية
Zamyla Chan، لكن--
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: حرف واحد على كل سطر،
بما في ذلك اسم البرنامج.
لذا في الحقيقة، دعوني أمرر هذا لأعلى
حتى يصبح أكبر قليلاً.
Enter.
حسنًا، إن البرنامج غبي قليلاً،
ولكنه يؤكد أن استخدام المصفوفات
هل لدي إمكانية الوصول ليس فقط إلى الكلمات،
ولكن يمكنني نوعًا ما
الحصول على البعد الثاني.
ومن خلال كل كلمة، يمكنني
الحصول على كل حرف بداخلها.
ونحن نقوم بذلك، مجددًا، فقط باستخدام
ليس فقط أقواسًا مربعة مفردة،
ولكن اثنين.
ومجددًا، قم بتفصيل هذا
إلى المبادئ الأساسية.
ما هو هذا القوس الأول؟
هذه هي وسيطة i،
سلسلة i في المصفوفة.
ومن ثم إذا أخذنا هذا
مجددًا، باستخدام قوس j،
والذي يعطيك الحرف j
داخل هذا.
الآن، مَن يهتم بأي من
هذا النوع من الوظائف؟
حسنًا، دعوني أقوم بالتمرير مجددًا
وأقترح تطبيقًا واحدًا هنا.
لذا تذكروا أن علم الكمبيوتر هو فقط عبارة عن
حل مشكلة حقًا.
ولكن لنفترض أن المشكلة
التي تريد حلها

Arabic: 
هي في الواقع عبارة عن تمرير
رسالة سرية في الصف الدراسي
أو إرسال سر إلى شخص ما
أيًا كان السبب.
حسنًا، يسمَى المدخل
إلى تلك المشكلة
بشكل عام بالاختبار البسيط،
رسالة تريد إرسالها إلى ذلك الشخص الآخر.
أنك تريد أن يظهر النص المشفر
منه بشكل مثالي،
والتي تكون مشفرة ومشوشة،
ومعلومات مشفرة إلى حد ما
وهكذا أي شخص في الغرفة، المعلم مثلاً،
لا يمكنه انتزاع دفتر الملاحظات
وقراءة ما ترسله إلى
فتى أحلامك أو الشخص الذى تحبه الموجود فى الغرفة،
أو في أي سياق آخر أيضًا.
لكن المشكلة تكمن فى إن كانت
الرسالة التي تريد إرسالها،
هى مرحبًا!، إلى صديقنا القديم
مع علامة تعجب،
يمكنك تشفيرها في سياقات
محددة مثل 72، أو 73،أو 33.
ويمكنني القول أن معظم الفصول الدراسية في الحرم الجامعي
إذا كتبت على قطعة من الورق 72،
73، 33، ومررتها خلال الغرفة،
ومهما اعترضها الأستاذ الجامعي،
فلن يفهم ما تقوله على أى حال.
لكن هذا ليس نظامًا جيدًا.
هذا ليس نظام تشفير.
لماذا؟
لأنه ليس آمنًا.
[INAUDIBLE]
[INTERPOSING VOICES]
ديفيد ج. مالان: أجل.
أي شخص يستطيع الوصول إلى
هذا، أليس كذلك، طالما

English: 
is to actually pass a
secret message in class
or send someone a secret
for whatever reason.
Well, the input to that
problem is generally
called plain test, a message you
want to send to that other person.
You ideally want ciphertext
to emerge from it,
which is enciphered and scrambled,
somehow encrypted information
so that anyone in the room, like the
teacher, can't just grab the note
and read what you're sending to your
secret crush or love across the room,
or in any other context as well.
But the problem is that if the
message you want to send, say,
is our old friend Hi!,
with an exclamation point,
you can encode it in certain
contexts as just 72, 73, 33.
And I daresay most classes on campus
if you wrote on a piece of paper 72,
73, 33, passed it through the room,
and whatever professor intercepts it,
they're not going to know
what you're saying anyway.
But this is not a good system.
This is not a cryptosystem.
Why?
It's not secure.
[INAUDIBLE]
[INTERPOSING VOICES]
DAVID J. MALAN: Yeah.
Anyone has access to
this, right, so long

Arabic: 
كما كنتم تحضرون الأسبوع الأول مثلاً
أو صفر من CS50، أو أن
لديكم معرفة عامة بـ Ascii.
مثل هذا مجرد شفرة ما.
أعني أن Ascii هو نظام
يقوم بتعيين الأحرف إلى أرقام.
وأي شخص آخر يعرف
تلك الشفرة فمن الواضح
أنه يعرف ما هي رسالتك،
لأنه ليس سرًا فريدًا من نوعه
لك والمتلقي.
إذًا ربما هذه ليست أفضل فكرة.
حسنًا، يمكنك أن تكون
أكثر تطورًا قليلاً.
وترجع هذه--
فى الواقع إلى كونها، صورة
من الحرب العالمية الأولى لرسالة أُرسلت
من ألمانيا إلى المكسيك
تم تشفريها بطريقة مشابهة جدًا.
ولم تكن تستخدم Ascii.
والأرقام ،التي يمكنك
استخلاصها من الصورة،
هي في الواقع أكبر من ذلك بكثير.
ولكن في هذا النظام، في السياق العسكري،
كان هناك كتاب شفرات.
مشابهة جدًا في جوهرها
للـ Ascii، حيث لديك
عمود من الأرقام وعمود من
الأحرف التي تتوافق معها،
كتاب الشفرات الذي بشكل عام يحتوي
على أرقام مثلاً، ثم ربما
حروف أو كلمات كاملة
حتى تتوافق معها،
وأحيانًا الآلاف منهم،
يكون حرفيًا كتابًا كبيرًا جدًا عن الشفرات.
وطالما فقط، في هذا السياق
أن الألمان والمتلقين،
المكسيكيين، توّصلوا
إلى الكتاب نفسه،

English: 
as you attend like week 1
or 0 of CS50, or you just
have general familiarity with Ascii.
Like this is just a code.
I mean Ascii is a system
that maps letters to numbers.
And anyone else who
knows this code obviously
knows what your message is,
because it's not a unique secret
to you and the recipient.
So that's probably not the best idea.
Well, you can be a little
more sophisticated.
And this is back--
actually, a photograph
from World War I of a message that
was sent from Germany to Mexico
that was encoded in a very similar way.
It wasn't using Ascii.
The numbers, as you can
perhaps glean from the photo,
are actually much larger.
But in this system, in a militaristic
context, there was a code book.
So similar in spirit to
Ascii, where you have
a column of numbers and a column of
letters to which they correspond,
a codebook more generally has
like numbers, and then maybe
even letters or whole words
that they correspond to,
sometimes thousands of them, like
literally a really big book of codes.
And so long as only, in this context
the Germans and the recipients,
the Mexicans, had access
to that same book,

Arabic: 
يمكنهم التعمية وفك التعمية،
أو بالأحرى تشفير وفك تشفير المعلومات.
بالطبع، في هذا
السياق المحدد للغاية--
يمكنك قراءة المزيد حول
هذا في النصوص التاريخية--
تم اعتراض هذا.
هذه الرسالة، على ما يبدو
ليست خطرًا، رغم أنها بالتأكيد
تبدو مثيرة للشكوك
مع كل هذه الأرقام،
إذًا، هى خطر، قام البريطانيون،
في هذه الحالة بالفعل، باعتراضها.
وبفضل العديد من
المجهودات وتحليل الشفرات،
تم كسر نمط التعليمات البرمجية لحديقة
بلتشلي، وإن كانوا حينها،
قادرين على اكتشاف ما تمثله
الأرقام من كلمات
وفك تشفير الرسالة في الواقع.
في واقع الأمر، إليكم
صورة لبعض الكلمات
التي تم ترجمتها
من لغة إلى أخرى.
ولكن المزيد حول هذا على
الإنترنت أو المراجع النصية.
اتضح أن هذه القصيدة أيضًا
كان بها تعليمات برمجية مماثلة، أليس كذلك؟
إذًا بمناسبة وجودكم فى بوسطن
هنا، قد تتذكرون هذا.
"انصتوا يا أطفالي، وسأقص عليكم
قصيدة "رحلة منتصف الليل لبول ريفير".
في 18 أبريل
لعام '75، رجل بالكاد
يحيا الآن ويتذكر
هذا اليوم والسنة المشهورين.
فقال لصديقه، إذا كانت الجيش البريطاني
يسير براً أو بحراً

English: 
only they could encrypt and decrypt, or
rather encode and decode information.
Of course, in this
very specific context--
you can read more about
this in historical texts--
this was intercepted.
This message, seemingly
innocuous, though definitely
suspicious looking
with all these numbers,
so therefore not innocuous, the British,
in this case actually, intercepted it.
And thanks to a lot of
efforts and cryptanalysis,
the Bletchley Park style code
breaking, albeit further back,
were they able to figure out what
those numbers represented in words
and actually decode the message.
And in fact, here's a
photograph of some of the words
that were translated
from one to the other.
But more on that in any
online or textual references.
Turns out in this poem too
there was a similar code, right?
So apropos of being in Boston
here, you might recall this one.
"Listen my children, and you shall hear
of the midnight ride of Paul Revere.
On the 18th of April
in '75, hardly a man
is now alive who remembers
that famous day and year.
He said to his friend, if the
British march by land or sea

Arabic: 
من المدينة مساء
الليلة، فعلق مصباحًا
عاليًا فى قنطرة جرس برج
الكنيسة الشمالية كإشارة ضوئية،
واحدًا إذا كان عبر البر، واثنين إذا كان عبر البحر.
وسأكون على الشاطئ الآخر
مستعدًا للمضي ودق
ناقوس الخطر فى كل
قرية ومزرعة لأهل "ميدلسكس"
ليتأهبوا ويستعدوا."
إذًا اتضح أن بعض هذا
ليس صحيحًا البتة في الواقع،
ولكن شفرة واحد إذا كانوا عبر البر
واثنين عبر البحر كانت
مثالاً لشفرة المرة واحدة نوعًا ما.
لأنه إذا كان الثوار في
الثورة الأمريكية
قرّروا سرًا نوعًا ما بين أنفسهم
حرفيًا - سنضع
مصباحًا واحدًا على رأس
الكنيسة إذا جاء البريطانيون برًا.
وسنستخدم بدلاً من ذلك اثنين إذا كان البريطانيون
قادمين عن طريق البحر.
مثل هذا يعد شفرة ما.
ويمكنكم كتابتها فى كتاب ما،
إلا إذا كان لديكم كتاب الشفرة.
ولكن بالطبع، بمجرد
أن يكتشف شخص ما هذا النمط،
فسيكون تم اختراقه.
وهكذا فإن كتب الشفرة لا تميل إلى
تكون الآليات الأقوى
لتشفير المعلومات.
بدلاً من ذلك، من الأفضل استخدام
شيء خوارزمي أكثر.
ومن الرائع، في علم الحاسوب
وجود هذا الصندوق الأسود
لكي-- نظل نقول إنه،
موطن الخوارزميات.

English: 
from the town tonight
night, hang a lantern
aloft in the belfry arch of the
North Church tower as a signal light,
one if by land, and two if by sea.
And I on the opposite shore
will be ready to ride and spread
the alarm through every Middlesex
village and farm for the country folk
to be up and to arm."
So it turns out some of that is
not actually factually correct,
but the one if by land and
the two if by sea code were
sort of an example of a one-time code.
Because if the revolutionaries in
the American Revolution kind of
decided secretly among themselves
literally that-- we will put up one
light at the top of a church if
the British are coming by land.
And we will instead use two if the
British are instead coming by sea.
Like that is a code.
And you could write it down in a
book, unless you have a code book.
But of course, as soon as
someone figures out that pattern,
it's compromised.
And so code books tend not to
be the most robust mechanisms
for encoding information.
Instead, it's better to use
something more algorithmic.
And wonderfully, in computer
science is this black box
to-- we keep saying,
the home of algorithms.

English: 
And in general, encryption is a
problem with inputs and outputs,
but we just need one more input.
The input is what's generally
called the key, or a secret.
And a secret might just be a number.
So for instance, if I
wanted my secret to be 1,
because we'll keep the example simple,
but it could really be any number.
And indeed, we saw with the
photograph a moment ago,
the Germans used much larger than
this, albeit in the context of codes.
Suppose that you now want to send
a more private message to someone
across the room in a
class that, I love you.
How do you go about encoding that
in a way that isn't just using Ascii
and isn't just using
some simple code book?
Well, let me propose that now that we
understand how strings are represented,
right-- we're about to make love
really, really lame and geeky--
so now that you know how to
express strings computationally,
well, let's just start
representing "I love you" in Ascii.
So I is 73.
L is 76.
O-V-E Y-O-U. That's just Ascii.
Should not send it this
way, because anyone
who knows Ascii is going
to know what you're saying.

Arabic: 
وبشكل عام، لديّ التشفير مشكلة
مع المدخلات والمخرجات،
لكننا نحتاج فقط إلى مُدخل واحد إضافي.
المُدخل هو ما يسمّى عمومًا
المفتاح، أو السر.
والسر قد يكون مجرد رقم.
فعلى سبيل المثال، إذا أردت
أن يكون سرّي رقم 1،
لأننا سنبقي على المثال فى شكل مبسط،
ولكن حقًا يمكن أن يكون أي رقم.
وبالفعل، رأينا فى الصورة
منذ لحظات،
استخدام الألمان لأكبر من هذا،
وإن كان ذلك في سياق الشفرات.
افترضنا أنكم تريدون الآن إرسال
رسالة أكثر خصوصية إلى شخص ما
عبر الغرفة في
الفصل هى، أنا أحبك.
كيف تقوم بتشفير ذلك
بطريقة ما لا تستخدام مجرد Ascii
ولا تستخدم مجرد
بعض كتب التشفير البسيطة؟
حسنًا، دعوني أفترض الآن أننا
فهمنا كيف يتم تمثيل السلاسل،
صحيح-- نحن حقًا على وشك أن
نسفه ونقلل من قيمة الحب--
إذًا حتى الآن قد عرفتم كيفية
تمثيل السلاسل بشكل حسابي،
حسنًا، دعونا فقط نبدأ
بتمثيل جملة "أنا أحبك" في Ascii.
إذًا I تكون 73.
L تكون 76.
O-V-E Y-O-U. هذا هو Ascii.
لا ينبغي إرسالها بهذه الطريقة،
لأن أي شخص
يعرف Ascii سيمكنه
معرفة ما تقوله.

English: 
But what if I enciphered this message,
I performed an algorithm on it?
And at its simplest,
an algorithm can just
be math-- simple
arithmetic, as we've seen.
So you know, let me just
use my secret key of 1.
And let me make sure that my crush knows
that I am using a secret value of 1.
So he or she also knows
to expect that value.
And before I send my message, I'm
going to add 1 to every letter.
So 73 becomes 74.
76 becomes 77.
80, 87, 70, 90, 80, 86.
Now this could just
be sent in the clear.
But then, I could actually
send it as a textual message.
So let's convert it back to Ascii.
74 is now J. 77 is now M. 80 is now P.
And you can perhaps see the pattern.
This message was, I love you.
And now, all of the letters
are off by one, I think.
I became J. L became M.
O became P, and so forth.

Arabic: 
ولكن ماذا لو قمت بتشفير هذه الرسالة،
وقمت بتطبيق خوارزمية عليها؟
وفى أبسط الأحوال، يمكن
أن تكون الخوارزمية
رياضيات- عملية حسابية
بسيطة، كما رأينا.
أتدرون، دعوني فقط
أستخدم المفتاح السري لديّ رقم 1.
ودعوني أتأكد أن فتى أحلامي يعرف
أنني أستخدم القيمة السرية لرقم 1.
إذًا هو أو هي أيضًا
يدرك تلك القيمة.
وقبل أن أبعث رسالتي، سأقوم
بإضافة رقم 1 إلى كل حرف.
إذًا، 73 يصبح 74.
76 يصبح 77.
80 و87 و70 و90 و80 و86.
الآن يمكن إرسال
هذا بشكل واضح.
ولكن لاحقًا، يمكنني فى الواقع
إرساله كرسالة نصية.
إذًا دعونا نرجعه إلى Ascii.
74 أصبح الآن j. و77 أصبح الآن M. و80 أصبح الآن P.
وربما يمكنك أن ترى النمط.
هذه الرسالة كانت، أحبك.
والآن، أعتقد أن جميع الأحرف
خطأ بمقدار 1، على ما أظن.
I أصبح J. وL أصبح M.
وO أصبح P، وهكذا.

Arabic: 
إذًا الادعاء سيكون،
مشفرًا، سأقوم
بإرسال تلك الرسالة
عبر الغرفة.
والآن لن يتمكن أي شخص لديه كتاب الشفرات
من فكها.
لا يمكنني سرقة الكتاب
وفك شفراتها،
لأن المفتاح الآن هو
فقط في عقلي، إذا جاز التعبير.
إنه فقط الرقم
1 الذي هو أو هي وأنا
تعين علينا الاتفاق عليه مسبقًا
أننا سنستخدمه
لإرسال رسائلنا السرية.
لذا إذا التقط شخص ما هذه الرسالة،
المعلم في الفصل أو أي شخص،
كيف يمكنهم محاولة
فكها أو حل رموز تلك الشفرة؟
هل هناك أي أساليب
متاحة لهم؟
يمكنني القول أنه يمكننا نوعًا ما الكشف عما
بداخل مذكرة الحب تلك.
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: ماذا؟
طريقة التخمين والتحقق.
حسنًا، يمكننا تجربة كل--
ما يزال هناك بعض التباعد نوعًا ما.
إذًا تدركون حقًا، أنه يمكننا القيام
بتحليل شفرتها نوعًا ما،
تحليل التكرار.
مثل، أنه لا يمكنني التفكير في
الكثير من الكلمات باللغة الإنجليزية
التي تحتوي على حرف واحد فيها.
إذًا ما الذي تمثله J على الأرجح؟
[INTERPOSING VOICES]
ديفيد ج. مالان: I، ربما.
ربما A، ولكن ربما I. وليس
هناك الكثير من الخيارات الأخرى.
لذلك تجسسنا على جزء واحد
الرسالة بالفعل.
أرى القواسم المشتركة.
هناك اثنان من ماذا هنا؟

English: 
So now the claim would
be, cryptographically, I'm
going to send this
message across the room.
And now no one who has a code book
is going to be able to solve this.
I can't just steal the
book and decode it,
because now the key is
only up here, so to speak.
It's just the number
1 that he or she and I
had to agree upon in
advance that we would
use for sending our secret messages.
So if someone captures this message,
teacher in the room or whoever,
how would they even go about
decoding this or decrypting it?
Are there any techniques
available to them?
I daresay we can kind of
chip away at this love note.
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: What's that?
Guess and check.
OK, we could try all--
there still kind of some spacing.
So you know honestly, we could do
like kind of a cryptanalysis of it,
a frequency attack.
Like, I can't think of
too many words in English
that have a single letter in them.
So what does J probably represent?
[INTERPOSING VOICES]
DAVID J. MALAN: I, probably.
Maybe A, but probably I. And
there's not too many other options.
So we've attacked one part
of the message already.
I see a commonality.
There's two what in here?

Arabic: 
اثنان P. ولا أعرف بالضرورة
أنها تمثل O، ولكن
أعلم أنه الحرف نفسه.
لذلك إذا واصلت تلك العملية المدروسة
أو هذا الاختبار والخطأ،
واكتشفت، أوه،
ماذا لو كان هذا هو حرف O؟
وذاك O.
ثم لحظة من فضلكم.
إنهم ينتقلون من واحد إلى آخر.
ربما يعطي هذا، أنا أحبك.
مثل لو كنت بالفعل تستطيع،
مع بعض الاحتمالات،
فك تشفير رسالة ما من خلال
تحليلها بهذه الطريقة نوعًا ما.
إنها على الأقل أكثر أمانًا
من كتاب الشفرات،
لأنك لن تتعرض للاختراق
إذا كان الكتاب نفسه مسروقًا.
ويمكنك تغيير المفتاح
فى كل مرة، طالما اتفقت
أنت والمتلقي
على شيء ما بالفعل.
لكن على الأقل وضعنا الآن
هذه الآلية في الحسبان.
إذًا مجرد فهمك
لما يمكنك القيام به مع السلاسل،
هل يمكنك في الواقع الآن القيام حقًا
بأشياء مثيرة للاهتمام في المجال المحدد
لهم؟
في الواقع، سابقًا، القيصر،
سابقًا في الأوقات العسكرية حقًا
استخدم تشفير مثل هذا تمامًا.
وبصراحة، عندما تكون الأول
في استخدام هذه التشفيرات،
فهي في الواقع آمنة نوعًا ما،
حتى لو كانت بسيطة نسبيًا.
لكن آملاً، عدم استخدام مفتاح
1، فقط، ربما 2، أو 13، أو 25،
أو شيءٍ أكبر.

English: 
Two P. And I don't necessarily
know that that maps to O, but I do
know it's the same character.
So if I kind of continue this thoughtful
process or this trial and error,
and I figure out, oh,
what if that's an O?
And then that's an O.
And then wait a minute.
They're passing from one to another.
Maybe this says, I love you.
Like you actually can,
with some probability,
decrypt a message by doing
this kind of analysis on it.
It's at least more secure
than the code book,
because you're not compromised
if the book itself is stolen.
And you can change the key
every time, so long as you
and the recipient actually
agree on something.
But at least we now have
this mechanism in place.
So with just the understanding
of what you can do with strings,
can you actually now do really
interesting domain-specific things
to them?
And in fact, back in the day, Caesar,
back in militaristic times literally
used a cipher quite like this.
And frankly, when you're the
first one to use these ciphers,
they actually are kind of secure,
even if they're relatively simple.
But hopefully, not just using a
key of 1, maybe 2, or 13, or 25,
or something larger.

Arabic: 
لكن هذا مثال
عن الشفرة البديلة،
أو الشفرات الدائرة حيث
كل شيء نوعًا ما يدور--
A تصبح B ،B تصبح
C. أو يمكنك نوعًا ما
تدويرها بصورة أكبر من ذلك.
حسنًا، دعونا نلقي نظرة
على مثال أخير هنا
لميزةٍ واحدةٍ أخرى
بدائية ونهائية
اليوم، قبل أن نرجع للوراء إلى مستوى
أعلى ونجمع كل شيءٍ معًا.
يتضح أن طباعة
رسائل الخطأ
ليست الطريقة الوحيدة للإشارة إلى
أن شيئًا ما قد حدث بشكلٍ خاطئ.
هناك كلمة رئيسية جديدة، استخدام جديد
لكلمة رئيسية قديمة في هذا المثال،
وهو في الواقع تقليد
للإشارة إلى الأخطاء.
إذًا هذا مثال يُسمى exit.c.
ويبدو أنه يريد الإنسان أن يفعل
ماذا، إذا استنتجنا من التعليمات البرمجية؟
الجمهور: خروج، [INAUDIBLE].
ديفيد ج. مالان: نعم.
كررها؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان، حسنًا، إنه
يريد-- حسنًا ماذا
تريد أن يفعل الإنسان ضمنيًا،
استنادًا إلى printf هنا؟
كيف يمكنني تشغيل هذا البرنامج؟
أجل؟
الجمهور: [INAUDIBLE]
فقط قم بتطبيق [INAUDIBLE]..
ديفيد ج. مالان: نعم.

English: 
But this is an example
of a substitution cipher,
or a rotational cipher where
everything's kind of rotating--
A's becoming B, B's becoming
C. Or you can kind of
rotate it even further than that.
Well, let's take a look
at one last example here
of just one other final
primitive of a feature
today, before we then go back high
level to bring everything together.
It turns out that printing
out error messages
is not the only way to signal
that something has gone wrong.
There's a new keyword, a new use
of an old keyword in this example,
that's actually a convention
for signaling errors.
So this is an example called exit.c.
It apparently wants the human to do
what, if you infer from the code?
AUDIENCE: Exit [INAUDIBLE].
DAVID J. MALAN: Yes.
Say again?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: Well, it
wants the-- well, what
does it what the human to do
implicitly, based on the printf's here?
How should I run this program?
Yeah?
AUDIENCE: [INAUDIBLE]
just apply [INAUDIBLE]..
DAVID J. MALAN: Yeah.

Arabic: 
لذا لأي سبب من الأسباب،
هذا البرنامج ضمنيًا
يريد مني أن أكتب بالضبط
كلمتين في المُحث.
لأنه إذا لم أفعل ذلك، فسيصرخ
في وجهي، أنه يفتقد وسيطة سطر الأوامر.
ثم سيرجع 1،
أيًا كان ذلك.
وبخلاف ذلك، سوف يقول،
أهلاً، كذا وكذا.
إذًا إذا قمت بالفعل بتشغيل هذا البرنامج--
فاسمحوا لي بالعودة هنا
وكتابة make exit--
عذرًا، في دليلي، make exit.
حسنًا، نقطة خط مائل exit، enter،
أنا أفتقد وسيطة سطر الأوامر.
حسنًا، اسمحوا لي بوضع اسم Zamyla.
أوه، Hello Zamyla.
اسمحوا لي بوضع Zamyla Chan.
لا، أنا أفتقد وسيطة سطر الأوامر.
يريد فقط وسيطة واحدة،
حتى في هذه الحالة هنا.
أنا أرى بصريًا رسالة الخطأ،
لكن من الواضح أن
الكمبيوتر يعطي إشارة لي بما
يسمى تعليمات الإنهاء البرمجية.
إذن فالقصة الطويلة باختصار، أننا شاهدنا
أمثلة بالفعل الأسبوع الماضي عن الطريقة
التي يمكنك بها الحصول
على دالة لإرجاع قيمة.
ورأينا كيف [؟إيرين؟] جاء
على خشبة المسرح،
وأعادت لي قصاصة
ورق مع سلسلة عليها.
لكن من الواضح أن
main هو خاص قليلاً.
إذا قامت main بإرجاع قيمة مثل 1
أو 0، فيمكنك بالفعل رؤية ذلك،

English: 
So for whatever reason,
this program implicitly
wants me to write exactly
two words at the prompt.
Because if I don't, it's going to yell
at me, missing command line argument.
And then it's going to
return 1, whatever that is.
Otherwise, it's going to
say, Hello, such and such.
So if I actually run this program--
let me go back over
here and do make exit--
oops-- in my directory, make exit.
OK, dot slash exit, enter, I'm
missing a command line argument.
All right, let me put Zamyla's name.
Oh, Hello Zamyla.
Let me put Zamyla Chan.
Nope, missing command line argument.
It just wants the one,
so in this case here.
I'm seeing visually the error
message, but it turns out
the computer is also signaling to
me what the so-called exit code is.
So long story short, we've already
seen examples last week of how
you can have a function return a value.
And we saw how [? Erin ?]
came up on stage,
and she returned to me a piece
of paper with a string on it.
But it turns out that
main is a little special.
If main returns a value like 1
or 0, you can actually see that,

English: 
albeit in a kind of a non-obvious way.
If I run exit, and I run it
correctly with Zamyla as the name,
if I then type echo, dollar sign,
question mark, of all things,
enter, I will then see exactly what main
returned with, which in this case is 0.
Now, let me try and be uncooperative.
If I actually run just dot
slash exit, with no word,
I see, missing command line argument.
But if I do the same cryptic command,
echo, dollar sign, question mark,
I see that main exited with 1.
Now, why is this useful?
Well, as we start to write
more complicated programs,
it's going to be a convention
to exit from main by returning
a non-zero value, if
anything goes wrong.
0 happens to mean everything went well.
And in fact, in all
of the programs we've
written thus far, if you
don't mention return anything,
main automatically for you returns 0.
And it has been all this time.
It's just a feature, so you don't
have to bother typing it yourself.

Arabic: 
وإن كان بطريقة غير واضحة نوعًا ما.
إذا قمت بتشغيل exit، وقمت بتشغيلها
بشكل صحيح باستخدام Zamyla كاسم،
إذا قمت بعد ذلك بكتابة echo،
علامة الدولار، علامة استفهام، لجميع الأشياء،
enter، سأرى بعد ذلك بالفعل ما الذي
عادت به main، وهي في هذه الحالة 0.
الآن، اسمحوا لي
بالمحاولة وأكون غير متعاون.
إذا قمت بالفعل بتشغيل نقطة
خط مائل exit، بدون كلمة،
سأرى، أنا أفتقد وسيطة سطر الأوامر.
لكن إذا قمت بالأمر المشفر نفسه،
echo، علامة الدولار، علامة استفهام،
سأرى أن main خرجت بـ 1.
الآن، لماذا هذا مفيد؟
حسنًا، عندما بدأنا
نكتب برامج أكثر تعقيدًا،
سيكون من المتعارف عليه
الخروج من main بإرجاع
قيمة غير صفرية،
إذا حدث خطأ ما.
ينتج 0 ليعني أن كل شيء سار بشكل جيد.
وفي الواقع، في كل البرامج لدينا
تمت كتابة هذا حتى الآن،
إذا لم تذكر إرجاع أي شيء،
فسترجع main تلقائيًا لك 0.
ولقد كان ذلك طوال هذا الوقت.
إنها مجرد ميزة، لذا فلا
تزعج نفسك بكتابتها.

Arabic: 
ولكن اللطيف في ذلك،
أو ما هو حقيقي بشأن ذلك،
هو إذا كان على جهاز الكمبيوتر الشخصي أو Mac
لديك، إذا واجهت أي رسالة خطأ مزعجة
تقول، خطأ سلبي 29، حدث خطأ
في النظام، أو شيء ما توقف،
لكنك غالبًا ما ترى أرقام
على الشاشة، ربما.
مثل خطأ التعليمات البرمجية هذه والتي
تميل إلى الارتباط بهذه الأنواع من القيم.
لذا إذا كان الإنسان يكتب
برنامجًا وحدث خطأ ما
وحدث خطأ، فإنها كما هو متوقع
تقوم بإرجاع قيمة مثل هذه.
ويحق للكمبيوتر الوصول إليه.
وأن هذا ليس بهذه الفائدة للشخص
الذي يقوم بتشغيل البرنامج.
لكن عندما تصبح برامجك
أكثر تعقيدًا، سنرى
أن هذا بالفعل مفيد
كطريقة لإعطاء إشارة
أنه حدث خطأ ما بالفعل.
آه.
حسنًا، إنها صيغ كثيرة
مغلفة في سياق محبب.
أية أسئلة قبل تناول
مجال واحد نهائي؟
لا؟
حسنًا.
إذًا من الواضح أنه يمكننا الإجابة على
سؤال "من يهتم" بطريقة أخرى
أيضًا.
من الواضح أن-- اسمحوا لي بالمضي
قدمًا وفتح مثال لمصفوفتنا مرة أخرى هنا--

English: 
But what's nice about this,
or what's real about this,
is if on your Mac or PC, if you've ever
gotten an annoying error message that
says, error negative 29, system error
has occurred, or something freezes,
but you very often see
numbers on the screen, maybe.
Like those error codes actually tend
to map to these kinds of values.
So when a human is writing
software and something goes wrong
and an error happens, they
typically return a value like this.
And the computer has access to it.
And this isn't all that useful
for the human running the program.
But as your programs
get more complex, we'll
see that this is actually quite
useful as a way of signaling
that something indeed went wrong.
Whew.
OK, that's a lot of syntax
wrapped in some loving context.
Any questions before we
look at one final domain?
No?
All right.
So it turns out that we can answer the
"who cares" question in yet another way
too.
It turns out-- let me go ahead and open
up an example of our array again here--

English: 
that arrays can actually now be used
to solve problems more algorithmically.
And this is where life
gets more interesting.
Like we were so incredibly
in the weeds today.
And as we move forward
in the class, we're
not going to spend so
much time on syntax,
and dollar signs, and question marks,
and square brackets, and the like.
That's not the interesting part.
The interesting part is when we
now have these fundamental building
blocks, like an array, with
which we can solve problems.
So it turns out that
an array, you know, you
can kind of think of it
as a series of lockers,
a series of lockers that might
look like this, inside of which
are values-- strings, or
numbers, or chars, or whatnot.
But the lockers is an apt metaphor
because a computer, unlike us humans,
can only see and do one thing at a time.
It can open one locker and look
inside, but it can't kind of
take a step back, like we humans
can, and look at all of the lockers,
even if all of the doors are open.
So it has to be a more
deliberate act than that.
So what are the actual implications?
Well, all this time--
we had that phone book
example in the first week,
and the efficiency of that algorithm, of
finding Mike Smith in this phone book,

Arabic: 
يمكن استخدام هذه المصفوفات بالفعل
الآن لحل المشاكل بطريقة أكثر خوارزمية.
وهنا تصبح الحياة
أكثر إثارة.
لأننا مررنا بشكلٍ لا يصدق
بتعقيدات اليوم.
وكلما تقدمنّا
في الصف، نحن
لن نمضي الكثير
من الوقت في الصيغ،
وعلامات الدولار، وعلامات الاستفهام،
والأقواس المربعة، وما شابه ذلك.
هذا ليس جزءًا مثيرًا للاهتمام.
الجزء المثير للاهتمام هو عندما
نحصل الآن على هذه الكتل البنائية
الأساسية، مثل مصفوفة،
والتي بمكننا من خلالها حل مشاكل.
لذا يتضح أن
المصفوفة، أنت تعلم، يمكنك
نوعًا ما التفكير فيها
كسلسلة من الخزائن،
سلسلة من الخزانات التي قد تبدو
مثل هذا، وبداخلها يوجد
قيم-- سلاسل، أو
أرقام، أو حروف، أو غيرهم.
لكن الخزانات هي استعارة ملائمة
لأن جهاز الكمبيوتر، على عكس الأشخاص،
يمكنه فقط أن يرى ويفعل شيئًا واحدًا في المرة الواحدة.
يمكنه فتح خزانة واحدة والنظر
داخلها، لكن لا يمكنه نوعًا ما
الرجوع خطوة للوراء، كما يمكننا
نحن ذلك، والنظر داخل جميع الخزانات،
حتى إذا كانت جميع الأبواب مفتوحة.
لذا يجب أن يكون هناك
إجراء متعمد أكثر من ذلك.
لذا ما هي الآثار الفعلية؟
حسنًا، طوال هذا الوقت--
كان لدينا مثال
دليل الهاتف في الأسبوع الأول،
وكفاءة تلك الخوارزمية، من
العثور على مايك سميث في دليل الهاتف هذا،

English: 
all assumed what feature
of this phone book?
AUDIENCE: That it's
ordered alphabetically.
DAVID J. MALAN: That it
was ordered alphabetically.
And that was a huge plus, because
then I could go to the middle,
and I could go to the middle
of the middle, and so forth.
And that was an algorithmic possibility.
On our phones, if you
pull up your contacts,
you've got a list of first names, or
last names, all alphabetically sorted.
That is because, guess what
data structure or layout
your phone probably uses
to store your contacts?
It's an array of some sort, right?
It's just a list.
And it might be displayed
vertically, instead of horizontally,
as I've been drawing it today.
But it's just values that are back,
to back, to back, to back, to back,
that are actually sorted.
But how did they actually
get into that sorted order?
And how do you actually find values?
Well, let's consider what
this problem is actually
like for a computer, as follows.
Let me go ahead here.
Would a volunteer mind
joining us up here?
I can throw in a free stress ball.
OK, someone from the back?
OK, come on up here.
Come on.
What's your name?
ERIC: Eric.
DAVID J. MALAN: Aaron.
All right.
So Aaron's going to come on up.
And--
ERIC: Eric.
DAVID J. MALAN: I'm sorry?

Arabic: 
جميعنا يفترض ما هي
ميزة دليل الهاتف هذا؟
الجمهور: إنه مرتب
ترتيبًا أبجديًا.
ديفيد ج. مالان: إنه تم ترتيبه
ترتيبًا أبجديًا.
وكان هذا إضافةً كبيرة، لأنني
بعد ذلك استطعت الانتقال إلى المنتصف،
واستطعت الانتقل إلى منتصف
المنتصف، وهكذا.
وكان هذا ممكنًا خوارزميًا.
على هواتفنا، إذا
سحبت جهات الاتصال الخاصة بك،
فستحصل على قائمة من الأسماء الأولى،
أو أسماء العائلة، كلها مرتبة ترتيبًا أبجديًا.
هذا لأن، خمن ما هو هيكل
البيانات أو التخطيط
الذي ربما يستخدمه
هاتفك لتخزين جهات الاتصال الخاصة بك؟
إنها مصفوفة نوعًا ما، أليس كذلك؟
إنها مجرد قائمة.
وقد يتم عرضها
عموديًا بدلاً من أفقيًا،
كما رسمتها اليوم.
لكنها مجرد قيم
متصلة على التوالي مع بعضهم البعض
والتي يتم تخزينها بالفعل.
لكن كيف أصبحت في ذلك
الترتيب المخزن بالفعل؟
وكيف يمكنك بالفعل العثور على قيم؟
حسنًا، دعونا ننظر في ما
هي هذا المشكلة بالفعل
للكمبيوتر، على النحو التالي.
دعوني أمضي قدمًا هنا.
هل يمانع أحد المتطوعين
فى المجيء إلى هنا؟
يمكنني إهداؤه كرة ضغط.
حسنًا ، شخصًا ما من الخلف؟
حسنًا ، تعال إلى هنا.
تعال.
ما اسمك؟
إريك: إريك.
ديفيد ج. مالان: آرون.
حسنًا.
إذًا سيأتي آرون.
و--
إريك: إريك.
ديفيد ج. مالان: معذرةً؟

English: 
Oh, Eric.
Nice to meet you.
All right.
Come on over here.
So Eric, now normally, I would
ask you to find the number 23.
But seeing is that's a little easy,
can you go ahead and just find us
the number 50 behind these doors,
or really these yellow lockers?
8?
Nope.
42?
Nope.
OK.
Pretty good.
That's three, three out of seven.
How did you get it so quickly?
ERIC: I guessed.
DAVID J. MALAN: OK, so he guessed.
Is that the best algorithm
that Eric could have used here?
ERIC: Probably not.
DAVID J. MALAN: Well, I don't know.
Yes?
No?
AUDIENCE: Yeah.
DAVID J. MALAN: Why?
Why yes?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: He has
no other information.
So yes, like that was
the best you can do.
But let me give you a
little more information.
You can stay here.
And let me go ahead and
reload the screen here.
And let me go ahead and pull
up a different set of doors.
And now suppose that, much like the
phone book, and much like the phones
are sorted, now these doors are sorted.
And find us the number 50.
All right.
So good.
What did you do that time?
AUDIENCE: Well, [INAUDIBLE].

Arabic: 
أوه، إريك.
تشرفت بمقابلتك.
حسنًا.
تعال هنا.
لذا إريك، الآن وبشكلٍ طبيعي، أود أن
أطلب منك العثور على رقم 23.
ولكن هذا يبدو سهلاً قليلاً،
يمكنك المضي قدمًا والعثور لنا
على رقم 50 خلف هذه الأبواب،
أو حقًا هذه الخزانات الصفراء؟
8؟
كلا.
42؟
كلا.
حسنًا.
جيد جدًا.
هذه ثلاثة، ثلاثة من سبعة.
كيف حصلت عليها بهذه السرعة؟
إريك: قمت بالتخمين.
ديفيد ج. مالان: حسنًا، إذًا لقد خمّن.
هل هذه أفضل خوارزمية
كان يمكن أن يستخدمها إريك هنا؟
إريك: ربما لا.
ديفيد ج. مالان: حسنًا، لا أعرف.
نعم؟
لا؟
الجمهور: نعم.
ديفيد ج. مالان: لماذا؟
لماذا نعم؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: ليس لديه
معلومات أخرى.
لذا نعم، هذا كان
أفضل ما يمكنك القيام به.
ولكن اسمحوا لي أن أقدم لكم
القليل من المعلومات.
يمكنك البقاء هنا.
واسمحوا لي بالمضي قدمًا
وإعادة تحميل الشاشة هنا.
ودعوني أمضي قدمًا وأسحب
مجموعة مختلفة من الأبواب.
والآن لنفترض أن ذلك يشبه إلى حدٍ كبير
دليل الهاتف، والكثير من الهواتف
يتم ترتيبها، والآن هذه الأبواب تم ترتيبها.
اعثر لنا على الرقم 50.
حسنًا.
جيد جدًا.
ماذا فعلتَ هذه المرة؟
الجمهور: حسنًا، [INAUDIBLE].

Arabic: 
كان 50 هو 116.
لذلك أنا فقط--
ديفيد ج. مالان: حسنًا.
إذًا قفزتَ إلى الوسط
في البداية، ثم إلى النصف الأيمن.
ثم من الناحية الفنية-- إذًا نحن بعيدون بمقدار 1
من الناحية الفنية، أليس كذلك؟
لأن البحث الثنائي مثلاً كان
سينتقل إلى منتصف الـ--
لا بأس، عمل جيد جدًا يا إريك.
هنا، دعني أقدم لك
كرة ضغط كمكافأة.
حسنًا شكرًا لك.
عمل جيد جدًا.
إذًا بهذه المعلومات الإضافية،
كما تعلمون،
تمكّن إيرك من الأداء بشكل أفضل لأن المعلومات
كانت مُرتبة على الشاشة.
لكن كانت لديه رؤية واحدة فقط
لخزانة في كل مرة،
لأنه فقط من خلال الكشف عما بالداخل
سيستطيع أن يراه بالفعل.
إذًا هذا يبدو أنه يقترح
أنك بمجرد
حصولك على هذه المعلومات الإضافية في
مثال إريك، في مثال هاتفك،
في مثال دليل الهاتف، فإنك تتيح
الاحتمالات للمزيد، والمزيد من
الخوارزميات الفعّالة.
ولكن للوصول إلى هذا، كنا نؤجل
هذا طوال الوقت في الصف الدراسي
كيف يمكنك في الواقع فرز هذه العناصر.
وإذا كنتم لا تمانعون-- بهذه الطريقة،
نأمل أن ننتهي على
ملاحظة أكثر حيوية هنا
لأنني أعرف أننا أصابنا الملل لبرهة--

English: 
It was 50 is 116.
So I just--
DAVID J. MALAN: Right.
So you jumped to the middle,
initially, and then to the right half.
And then technically-- so we're
technically off by 1, right?
Because like binary search would
have gone to the middle of the--
that's OK, but very well done to Eric.
Here, let me at least reinforce
this with a stress ball.
So thank you.
Very well done.
So with that additional
information, as you know,
Eric was able to do better because the
information was sorted on the screen.
But he only had one insight
to a locker at a time,
because only by revealing what's
inside can he actually see it.
So this seems to
suggest that once you do
have this additional information in
Eric's example, in your phone example,
in the phone book example, you open up
possibilities for much much, much more
efficient algorithms.
But to get there, we've kind of been
deferring this whole time in class
how you actually sort these elements.
And if you wouldn't mind-- and this way,
we'll hopefully end on a more energized
note here because I know we've
been in the weeds for a while--

English: 
can we get like eight volunteers?
OK, so 1, 2, 3, 4-- how about
5, 6, 7, 8, come on down.
Oh, I'm sorry.
Did I completely overlook the front row?
OK.
All right, next time.
Next time.
Come on down.
Oh, and Colton, do you mind
meeting them over there instead?
All right.
Come on up.
What's your name?
[? CAHMY: ?] [? Cahmy. ?]
DAVID J. MALAN: [? Cahmy? ?] David.
Right over there.
What's your name?
MATT: Matt.
DAVID J. MALAN: Matt?
David.
[? JUHE: ?] [? Juhe. ?]
DAVID J. MALAN: [? Juhe? ?] David.
MAX: Max.
DAVID J. MALAN: Max, nice to meet you.
JAMES: James.
DAVID J. MALAN: James, nice to see you.
Here, I'll get more chairs.
What's your name?
,PEYTON: Peyton.
DAVID J. MALAN: Peyton?
David.
And two more.
Actually can what have you
come down to this end here?
What's your name.
ANDREA: Andrea.
DAVID J. MALAN: Andrea, nice to see you.
And your name?
[? PICCO: ?] [? Picco. ?]
DAVID J. MALAN: [? Picco, ?] David.
Nice to see you.
OK, Colton has a T-shirt for each
of you, very Harvard-esque here.
And each of these shirts, as you're
about to see, has a number on it.

Arabic: 
هلا حصلنا على ثمانية متطوعين؟
حسنًا، 1، 2، 3، 4-- ماذا عن
5، 6، 7، 8، تعالوا هنا.
أوه، معذرة.
هل تغاضيت تمامًا عن الصف الأمامي؟
حسنًا.
لا بأس، المرة القادمة.
المرة القادمة.
تعالوا إلى هنا.
أوه، وكولتون، هل تمانع في
مقابلتهم هنا بدلاً من هناك؟
حسنًا.
تعالوا.
ما اسمك؟
[? كامي: ?] [? كامي. ?]
ديفيد ج. مالان: [؟ كامي؟ ؟] ديفيد.
هناك بالضبط.
ما اسمك؟
مات: مات.
ديفيد ج. مالان: مات؟
ديفيد.
[؟ جوهي:؟] [؟ جوهي. ؟]
ديفيد ج. مالان: [؟ جوهي؟ ؟] ديفيد.
ماكس: ماكس.
ديفيد ج. مالان: ماكس، سعدت بلقائك.
جيمس: جيمس.
ديفيد ج. مالان: جيمس، سعدت بلقائك.
هنا، سأحضر المزيد من الكراسي.
ما اسمك؟
،بيتن: بيتن.
ديفيد ج. مالان: بيتن؟
ديفيد.
واثنين آخرين.
في الواقع هل يمكنكما
المجيء إلي هنا؟
ما اسمك.
أندريا: أندريا.
ديفيد ج. مالان: أندريا، سعدت بلقائك.
واسمك؟
[؟ بيكو:؟] [؟ بيكو. ؟]
ديفيد ج. مالان: [؟ بيكو،؟] ديفيد.
سعدت بلقائك.
حسنًا، لدى كولتون قميصًا لكل واحد
منكم، وهو على طراز جامعة هارفارد.
وكل واحد من هذه القمصان، التي
على وشك أن تروها، عليها رقم ما.

English: 
And that number is--
well, go ahead put them
on, if you wouldn't mind.
OK, thank you so much.
So I daresay we've arranged our humans
much like the lockers in an array.
Like we have humans back,
to back, to back, to back.
But this is actually both a
blessing and a constraint,
because we only have eight chairs.
So there's really not much room here, so
we're confined to just this space here.
And I see we have a 4,
8, 5, 2, 3, 1, 6, 7.
So this is great.
Like they are unsorted.
By definition, it's pretty random.
So that's great.
So let's just start off like this.
Sort yourselves from 1 to 8, please.
OK.
All right.
Well, what algorithm was that?
[LAUGHTER]
AUDIENCE: Look around, figure it out.
DAVID J. MALAN: Look
around, figure it out.
OK, well--
MATT: Human ingenuity.
DAVID J. MALAN: Human ingenuity?
Very well done.
So can we-- well, what
was like a thought
going through any of your minds?
MATT: Find a chair and sit down.
DAVID J. MALAN: Find the chair--
find the right chair.

Arabic: 
وهذا الرقم هو--
حسنًا، امضوا قدمًا وارتدوهم،
إذا لا تمانعون.
حسنًا، شكرًا جزيلاً لكم.
إذًا أعتقد أننا قد رتبنا الأشخاص لدينا
مثل الخزائن إلى حد كبير في مصفوفة.
فمثلاً لدينا مجموعة أشخاص،
متصلين على التوالي مع بعضهم البعض.
لكن هذا في الواقع نعمة
ونقمة،
لأن لدينا فقط ثمانية مقاعد.
إذًا لا يوجد في الحقيقة متسعًا هنا، لذلك
سنقتصر على هذه المساحة فقط هنا.
وأرى أن لدينا 4،
8، 5، 2، 3، 1، 6، 7.
هذا رائع.
كأنهم غير مُرتبين.
وحسب التعريف، هذا عشوائي جدًا.
إذًا هذا رائع.
إذًا دعونا نبدأ هكذا.
رتبوا أنفسكم من 1 إلى 8، رجاءً.
حسنًا.
حسنًا، أي خوارزمية كانت تلك؟
[LAUGHTER]
الجمهور: انظروا حولكم، وتبينوا الأمر.
ديفيد ج. مالان: انظروا حولكم، وتبينوا الأمر.
حسنًا، إذًا--
مات: الإبداع البشري.
ديفيد ج. مالان: الإبداع البشري؟
أحسنت للغاية.
إذًا هل يمكننا-- حسناً، معرفة ما الذي كان
يدور
في عقولكم؟
مات: العثور على كرسي والجلوس.
ديفيد ج. مالان: العثور على الكرسي--
العثور على الكرسي المناسب.

English: 
So go to a location.
Good.
So like an index location, right?
Arrays have indices, so to spea--
0, 1, 2, all the way up to 7.
And even though our shirts
are numbered from 1 to 8,
you can think in terms of 0 to 7.
So that was good.
Anyone else?
Other thoughts?
[? CAHMY: ?] I mean, this is
something we implicitly think of,
but no one told us that it
was ordered right to left.
Like we could have
done it left to right.
DAVID J. MALAN: OK.
Absolutely.
Could have gone from right to
left, instead of left to right.
But at least we all
agreed on this convention
too, so that was in your mind.
OK.
So good.
So we got this sorted.
Go ahead and re-randomize
yourself, if you could.
And what algorithm was this?
Just random awkwardness?
OK, so that's fine.
So it looks pretty random.
That will do.
Let's see if we can now
reduce the process of sorting
to something a little more algorithmic
so that, one, we can be sure
we're correct and not just kind of get
lucky that everyone kind of figured it
out and no one was
left out, and two, then
start to think about how
efficient it is, right?
Because if we've been gaining so
much efficiency for the phone book,
for our contacts, for
[? error ?] coming up,

Arabic: 
إذًا الذهاب إلى موقع.
جيد.
إذًا مثل موقع الفهرس، أليس كذلك؟
المصفوفات لديها مؤشرات،إذا جاز التعبير--
0، 1، 2، على النسق نفسه حتى 7.
وعلى الرغم من أن القمصان الخاصة بنا
مرقمة من 1 إلى 8،
يمكنك التفكير من حيث 0 إلى 7.
إذًا كان هذا جيدًا.
أي شخص آخر؟
أفكار أخرى؟
[؟ كامي:؟] أعني، هذا
شيء كنا نفكر فيه بشكل ضمني،
ولم يخبرنا أحد أن الترتيب
من اليمين إلى اليسار.
كان يمكننا الترتيب
من اليسار إلى اليمين.
ديفيد ج. مالان: حسنًا.
قطعًا.
كان يمكنكم الانتقال من اليمين إلى
اليسار، بدلاً من اليسار إلى اليمين.
ولكننا على الأقل
وافقنا جميعًا على هذا الاتفاق
أيضًا، إذًا كان ذلك في عقولكم.
حسنًا.
جيد جدًا.
إذًا حصلنا على هذا الترتيب.
امضوا قدمًا وأعيدوا ترتيب أنفسكم
عشوائيًا، إذا سمحتم.
أي خوارزمية كانت تلك؟
مجرد خلط عشوائي؟
حسنًا، هذا جيد.
إذًا يبدو عشوائيًا جدًا.
سيفي بالغرض.
دعونا نرى الآن إذا كان بإمكاننا
تقليل عملية الترتيب
إلى شيء حسابي أكثر من ذلك بقليل
حتى، أولاً، يمكننا أن نتأكد
أننا على صواب وليست مجرد صدفة
أن كل شخص تبين أمره
ولم يُستثنى أحد،
وثانيًا،
البدأ في التفكير في مدى
كفاءتها، أليس كذلك؟
لأنه إذا كنا نظفر بكفاءة
كبيرة لدليل الهاتف،
لجهات الاتصال لدينا، لـ
[؟ خطأ؟] التالي،

Arabic: 
كان يتعين علينا حقًا
أن نسأل طوال الوقت،
بالتأكيد، يمكنكم توفير الوقت بواسطة البحث الثنائي
وخوارزمية فرق تسد،
ولكن كم تستغرق
لتصل إلى نقطة معينة
حيث يمكنك استخدام البحث الثنائي
وخوارزمية فرق تسد؟
لأن الترتيب، إذا كان فائق الثمن
وباهظًا للغاية ويستغرق وقتًا طويلاً
ربما يكون سلبيًا تمامًا.
ويمكنكم كذلك البحث
في القائمة بأكملها،
بدلاً من ترتيب أي شيء.
حسنًا.
إذًا دعونا نرى هنا.
6 و5، لا أحب هذا.
لماذا؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: من المفترض أن يأتي
6 بعد 5.
وهكذا، هل يمكننا إصلاح هذا، من فضلكم؟
حسنًا.
ثم دعونا نرى.
حسنًا، 6 و1-- آه،
لا يعجبني هذا حقًا.
نعم، هل يمكننا إصلاح هذا؟
جيد جدًا.
6 و3، حسنًا، لقد حصلنا على
نتيجة غير متكافئة هنا.
إذًا 6 و3، هل يمكننا إصلاح هذا؟
و6-- نعم، حسنًا.
أوه، حسنًا، 6 و7-- جيد.
حسنًا، هذا جيد جدًا.
7 و8، جيد.
8 و4، آسف.
هل يمكننا التبديل هنا؟
حسنًا.
ثم 8 و2؟
هل يمكننا التبديل هنا؟
حسنًا.
دعوني أطرح عليكم
سؤالاً بلاغيًا إلى حد ما.

English: 
we really should have been
asking the whole time,
sure, you save time with binary
search and divide and conquer,
but how much did it cost
you to get to a point
where you can use binary
search and divide and conquer?
Because sorting, if it's super, super,
super expensive and time-consuming
maybe it's a net negative.
And you might as well just
search the whole list,
rather than ever sort anything.
All right.
So let's see here.
6 and 5, I don't like this.
Why?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: 6 is
supposed to come after 5.
And so, can we fix this, please?
All right.
And then let's see.
OK, 6 and 1-- ugh,
don't really like this.
Yeah, can we fix this?
Very nice.
6 and 3, OK, you really got the
short end of the stick here.
So 6 and 3, could we fix this?
And 6-- yeah, OK.
Ooh, OK, 6 and 7-- good.
All right, so that's pretty good.
7 and 8, nice.
8 and 4, sorry.
Could we switch here?
All right.
And then 8 and 2?
OK, could we switch here?
OK.
And let me ask you a
somewhat rhetorical question.

Arabic: 
حسنًا، هل انتهيت؟
حسنًا، لا.
من الواضح أنه لا، لكني عالجت
بعض المشاكل، أليس كذلك؟
أصلحت بعض التبديلات،
والأرقام غير المرتبة.
وفي الحقيقة، أنا-- ذكرني باسمك مجددًا؟
[? كامي: ?] [? كامي. ?]
ديفيد ج. مالان: [؟ كامي،؟] تزحزحت
نوعًا ما إلى اليمين هنا، إذا جاز التعبير.
كما لو كنتِ بعيدة نوعًا ما،
والآن أنتِ هنا.
ومثل الأرقام الأصغر،
نوعًا ما-- نعم 1.
كأنه، يا إلهي، كأنه شق طريقه
في هذا الاتجاه.
إذًا الأمور تسير،
بشكل منطقي.
وهذا شيء جيد.
أتعلمون ماذا؟
دعوني أحاول إصلاح بعض
المشاكل المتبقية.
إذًا 1 و5-- جيد.
أوه 3 و5، هل يمكنكما التبديل؟
5 و6، حسنًا.
6 و7؟
7 و4، هل يمكنكما التبديل؟
حسنًا.
7 و2، هل يمكنكما التبديل؟
والآن، لا يتعين عليّ
التحدث مع [؟ كامي؟] مجددًا،
لأننا نعرف أنها
في المكان الصحيح.
لذا أنا في الواقع لا يتعين
عليّ القيام بالكثير
من العمل هذه المرة، وهذا جيد نوعًا ما.
لكن، هل انتهيت؟
لا، من الواضح لا.
لكن ما هو النمط الآن؟
ما هو الطراز الأساسي؟
إذا قارنت فقط بين زوج
من الأشخاص والأرقام،
يمكنني تحسين الموقف
نوعًا ما في كل مرة

English: 
OK, am I done?
OK, no.
Obviously not, but I did
fix some problems, right?
I fixed some transpositions,
numbers being out of order.
And in fact, I-- what's your name again?
[? CAHMY: ?] [? Cahmy. ?]
DAVID J. MALAN: [? Cahmy, ?] kind of
bubbled to the right here, if you will.
Like you were kind of farther
down, and now you're over here.
And like the smaller
numbers, kind of-- yeah 1.
Like, my god, like he kind
of bubbled his way this way.
So things are percolating,
in some sense.
And that's a good thing.
And so you know what?
Let Me try to fix some
remaining problems.
So 1 and 5-- good.
Oh 3 and 5, could you switch?
5 and 6, OK.
6 and 7?
7 and 4, could you switch?
OK.
And 7 and 2, could you switch?
And now, I don't have to
speak with [? Cahmy ?] again,
because we know you're
in the right place.
So I actually don't have
to do quite as much work
this time, which is kind of nice.
But am I done?
No, obviously not.
But what's the pattern now?
Like what's the fundamental primitive?
If I just compare pairwise
humans and numbers,
I can slightly improve
the situation each time

English: 
by just swapping them, swapping them.
And each time now--
I'm sorry, [? Picco ?]
is in number 7's place.
I don't have to talk to him
anymore, because he's now bubbled
his way all the way up to the top.
So even though I'm doing the
same thing again and again,
and looping again and again
isn't always the best thing,
so long as you're looping fewer and
fewer times, I will eventually stop,
it would seem.
Because 6 is going to eventually
go in the right place, and then 5,
and then 4, and so forth.
So if we can just finish this algorithm.
Good.
Not good.
OK, 6 and 2, not good.
If you could swap?
OK, and what's your name again?
PEYTON: Peyton.
DAVID J. MALAN: Peyton is
now in the right place.
I have even less work now ahead of me.
So if I can just continue this process--
1 and 3, 3 and 5, 4 and
5, OK, and then 2 and 5.
And then, what's your name again?
MATT: Matt.
DAVID J. MALAN: Matt is
now in the right place.
Even less work.
We're almost there.
1 and 3, 3 and 4, 4 and
2, if you could swap.
OK, almost done.
And 1 and 3, 3 and 2, if you could swap.
Nice.
So this is interesting.
It would seem that-- you
know, in the first place,
I kind of compared
seven pairs of people.

Arabic: 
من خلال تبديلهم فقط، تبدليهم.
وفي كل مرة الآن--
أنا آسف، [؟ بيكو ؟]
في مكان رقم 7.
لا يتعين عليّ التحدث معه
أكثر من ذلك، لأنه شق الآن
طريقه للوصول إلى القمة.
إذًا رغم أنني أفعل الشيء
نفسه مرارًا وتكرارًا،
وأقوم بالتكرار الحلقي مرارًا وتكرارًا
فهذا ليس دائمًا أفضل شيء،
طالما كنت تكرر لمرات أقل
وأقل، فستتوقف في النهاية،
على ما يبدو.
لأن 6 ستذهب في النهاية إلى
المكان المناسب، ثم 5،
ثم 4، وهكذا.
لذلك إذا استطعنا فقط إنهاء هذه الخوارزمية.
جيد.
ليس جيدًا.
حسنًا، 6 و2، ليس جيدًا.
هل يمكنكما التبديل؟
حسنًا، ذكّرني باسمك مجددًا؟
بيتن: بيتن.
ديفيد ج. مالان: بيتن الآن
في المكان الصحيح.
لديّ عمل أقل الآن أمامي.
لذا إذا استطعت فقط مواصلة هذه العملية--
1 و3، و3 و5، و4 و5،
حسنًا، ثم 2 و5.
ثم، ذكرني باسمك مجددًا؟
مات: مات.
ديفيد ج. مالان: مات الآن
في المكان الصحيح.
صار لديّ عمل أقل.
كدنا نصل.
1 و3، و3 و4، و4 و2،
هل يمكنكما التبديل.
حسنًا، كدنا ننتهي.
و1 و3، و3 و2،
هل يمكنكما التبديل.
جيد.
إذًا هذا مثير للاهتمام.
يبدو أني-- أنتم
تعرفون، في المقام الأول،
قارنت نوعًا ما بين
سبعة أزواج من الأشخاص.

Arabic: 
ثم في المرة التالية،
قارنت كم زوجًا من الأشخاص
كحد أقصى؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: 6 فقط، أليس كذلك؟
لأننا كنا قادرين على ترك
[? كامي ?].
ثم تمكنا من ترك
[? بيكو ?]، ثم بيتن.
وبالتالي فإن عدد المقارنات
التي أجريتها أصبح أقل وأقل.
لذا يبدو هذا جيدًا للغاية.
ولكن أتعرف ماذا؟
قبل أن نحلل هذا، هل يمكنكم
ترتيب أنفسكم بشكل عشوائي مجددًا؟
تعد أي خوارزمية بشرية جيدة.
دعونا نحاول اتباع نهج واحد آخر، لأن
هذا يبدو غير واضح، أليس كذلك؟
كنت أصلح الأمور، ولكن كان
يتعين عليّ إصلاحها مرارًا وتكرارًا.
دعوني أحاول تقليل حجم المشكلة
هذه المرة من خلال فقط
اختيار الشخص صاحب الرقم الأصغر.
حسنًا، إذًا ما هو اسمك مجددًا؟
[؟ جوهي:؟] [؟ جوهي. ؟]
ديفيد ج. مالان: [؟ جوهي،؟] رقم
2-- هذا رقم صغير جدًا،
إذًا سأتذكر ذلك في
نوع المتغير العقلي.
4؟
لا، هذا رقم كبير جدًا.
كبير جدًا.
حسنًا، ذكّرني باسمك مجددًا؟
جيمس: جيمس.
ديفيد ج. مالان: جيمس.
جيمس هو رقم 1.
هذا جيد جدًا.
دعني أتابع التحقق.
حسنًا، جيمس، في المتغيّر العقلي
لديّ هو أصغر عدد.
أعلم أنني أريده في البداية.
لذا إذا كنت لا تمانع في المجيء معي.
وأنا آسف، ليس لك
مكان بعد الآن.
إذا يمكنك فقط-- أوه، أتدرون؟
هل يمكنكم جميعًا فقط التنحي جانبًا؟
حسنًا، امم، لا أعرف إن كنت أحب ذلك.
هذا كثير من العمل، أليس كذلك؟

English: 
And then the next time I went through,
I compared how many pairs of people
maximally?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: Just six, right?
Because we were able to
leave [? Cahmy ?] out.
And then we were able to leave
[? Picco ?] out, and then Peyton.
And so the number of comparisons I
was doing was getting fewer and fewer.
So that feels pretty good.
But you know what?
Before We even analyze that, can
you just randomize yourselves again?
Any human algorithm is fine.
Let's try one other approach, because
this feels kind of non-obvious, right?
I was fixing things, but I had to
keep fixing things again and again.
Let me try to take a bigger
bite out of the problem
this time by just selecting
the smallest person.
OK, so your name again is?
[? JUHE: ?] [? Juhe. ?]
DAVID J. MALAN: [? Juhe, ?] number
2-- that's a pretty small number,
so I'm going to remember that
in sort of a mental variable.
4?
No, you're too big.
Too big.
Oh, what was your name again?
JAMES: James.
DAVID J. MALAN: James.
James is a 1.
That's pretty nice.
Let me keep checking.
OK, James, in my mental
variable is the smallest number.
I know I want him at the beginning.
So if you wouldn't mind coming with me.
And I'm sorry, we don't
have room for you anymore.
If you could just-- oh, you know what?
Could you all just shuffle down?
Well, hm, I don't know if I like that.
That's a lot of work, right?

Arabic: 
نقل كل هذه القيم،
دعونا لا نفعل ذلك.
دعونا لا نفعل ذلك.
رقم 2، هل تمانعين
الذهاب حيث--
حيث--
جيمس: أنا جيمس.
ديفيد ج. مالان: كان جيمس؟
حسنًا، لقد نجحت في جعل المشكلة
أسوأ قليلاً نوعًا ما بهذه الطريقة،
الآن، رقم 2 أصبح بعيدًا
جدًا عن الهدف.
لكن كان من الممكن أن يحالفني الحظ،
وربما كانت هي رقم 7 أو 8.
لذا دعوني أزعم هذا، في
المتوسط، مجرد استبعاد الشخص
سيجعل الأمور متساوية نوعًا ما.
لكن جيمس الآن في المكان الصحيح.
تم.
الآن لدي مشكلة مقدارها 7 أشخاص.
إذًا دعوني أختار الشخص التالي
صاحب الرقم الأصغر.
4 هو الرقم الأصغر التالي، وليس
8، ولا 5، ولا 7-- أوه، 2.
ليس 3، ولا 6.
حسنًا، إذًا عدتِ إلى اللعبة.
حسنًا، تعالي مجددًا.
وهل يمكننا استبعاد رقم 4؟
وفي تلك الخوارزمية،
إذا جاز التعبير، أنا فقط
اخترت بشكل
تفسيري أصغر شخص.
أنا لا أقارن الجميع تمامًا بالطريقة
نفسها وأبادل بينهم زوجيًا،
أنا أقوم بالمزيد من المبادلات المجهرية.
إذًا سأذهب الآن للعثور على الرقم
الأصغر التالي، وهو رقم 3.
إذا تفضلت
بالظهور هنا؟
[؟ كامي، ؟] يتعين علينا،
للأسف، استبعادك،
لكن هذا يصب في صالحنا.
دعوني أبحث عن الرقم الأصغر
التالي، وهو رقم 4.
حسنًا، لقد عدتِ.
تعالي.
بدلي مع رقم 5.

English: 
Moving all these values,
let's not do that.
Let's not do that.
Number 2, could you
mind just going where--
where--
JAMES: It's James.
DAVID J. MALAN: --James was?
OK, so I've kind of made the
problem a little worse in that,
now, number 2 is farther
away from the goal.
But I could have gotten lucky,
and maybe she was number 7 or 8.
And so let me just claim that, on
average, just evicting the person
is going to kind of be
a wash and average out.
But now James is in the right place.
Done.
Now I have a problem that's of size 7.
So let me select the
next smallest person.
4 is the next smallest, not
8, not 5, not 7-- ooh, 2.
Not 3, 6.
OK, so you're back in the game.
All right, come on back.
And can we evict number 4?
And on this algorithm,
if you will, I just
interpretively select
the smallest person.
I'm not comparing everyone in quite the
same way and swapping them pairwise,
I'm doing some of more
macroscopic swaps.
So now I'm going to look for
the next smallest, which is 3.
If you wouldn't mind
popping around here?
[? Cahmy, ?] we have to,
unfortunately, evict you,
but that works out to our favor.
Let me look for the next
smallest, which is 4.
OK, you're back in.
Come on down.
Swap with 5.

Arabic: 
حسنًا، أبحث الآن عن رقم 5.
مهلاً، رقم 5، ها أنت ذا.
حسنًا.
إذًا تعال هنا.
حسنًا، أبحث عن رقم 6.
أوه، 6، بدلوا أماكنكم قليلاً.
حسنًا.
والآن أبحث عن رقم 7.
أوه، 7، إذا أمكنك الذهاب إلى هنا.
لكن لاحظوا، أنا لا أعود للخلف.
وهذا هو المهم.
خطواتي تصبح
أقصر وأقصر.
خطواتي المتبقية
تصبح أقصر وأقصر.
والآن قمنا بالفعل
بترتيب كل هؤلاء الأشخاص.
إذًا طريقتان مختلفتان اختلافًا جوهريًا،
لكن كلتيهما مُقارن بطبيعته،
لأنني أقارن
هذه الأحرف مرارًا،
وتكرارًا، وأبدلهم
إذا كانوا غير مرتبين.
أو في مستوى أعلى، أو أمر
عبرهم وأبدلهم مرارًا،
وتكرارًا.
ولكن كم عدد الخطوات التي
آخذها كل مرة؟
على الرغم أنني أفعل القليل
والقليل ولم أعد للخلف مرة أخرى،
في المرة الأولى، كنت أقوم بمقارنات
مثل n ناقص 1.
ثم عدت إلى هنا.
وفي الخوارزمية الأولى، توقفت
عن المضي قدر الإمكان نوعًا ما.
في الخوارزمية الثانية، أنا فقط
لم أعد للخلف قدر الإمكان نوعًا ما.
إذًا كانت مجرد طريقة
مختلفة نوعًا ما للتفكير في المشكلة.
ولكن بعد ذلك ماذا فعلت؟
سبع مقارنات مثلاً؟

English: 
OK, now I'm looking for 5.
Hey, 5, there you are.
OK.
So go here.
OK, looking for 6.
Oh, 6, a little bit of a shuffle.
OK.
And now looking for 7.
Oh, 7, if you could go here.
But notice, I'm not going back.
And this is what's important.
Like my steps are getting
shorter and shorter.
My remaining steps are
getting shorter and shorter.
And now we've actually
sorted all of these humans.
So two fundamentally different ways,
but they're both comparative in nature,
because I'm comparing
these characters again,
and again, and again, and swapping
them if they're out of order.
Or at a higher level, going
through and swapping them again,
and again, and again.
But how many steps am
I taking each time?
Even though I was doing fewer and
fewer and I wasn't doubling back,
the first time, I was doing
like n minus 1 comparisons.
And then I went back here.
And in the first algorithm, I
kind of stopped going as far.
In the second algorithm, I
just didn't go back as far.
So it was just kind of a different
way of thinking of the problem.
But then I did what?
Like seven comparisons?

Arabic: 
ثم ستة، ثم خمسة، ثم أربعة،
ثم ثلاثة، ثم اثنتين، ثم واحدة.
إنها تصبح أصغر، ولكن كم عدد
المقارنات في المجمل؟
لقد حصلت مثلاً على n أشخاص
n هو رقم.
الجمهور: [INAUDIBLE]
دايفيد ج. مالان: ليس
بدرجة السوء نفسها كالمتغيرات.
سنكون هنا طوال اليوم.
لكنها كبيرة.
إنها كبيرة.
دعونا-- نقدم عاصفة من التصفيق، رجاءً،
لمتطوعينا.
يمكنكم الاحتفاظ بالقمصان، إذا
رغبتم، كتذكار.
[APPLAUSE]
شكرًا جزيلاً لكم.
دعوني أرى ما إذا كان بامكاننا
تحديد ذلك-- شكرًا جزيلاً لكم--
ونرى كيف وصلنا في الواقع
إلى هذه النقطة.
إذا مضيت قدمًا ولم أسحب خزائننا،
وإنما إجاباتنا هنا،
دعوني أقول أن ما فعلناه
فقط كان في الأساس خوارزميتين.
واحدة تُسمي "bubble".
وكنت أتعمد نوعًا ما
إقحام الكلمة هناك.
"Bubble sort" هو فقط ترتيب
مُقارن، زوج مقابل زوج،
لإصلاح الأخطاء الصغيرة.
لكننا بحاجة إلي القيام به
مرارًا وتكرارًا.
حتى تشكل هذه الخطوات إضافة ما، ولكن
يمكننا التعبير عنهم كتعليمات برمجية زائفة.
لذا في التعليمات البرمجية الزائفة-- يمكنك كتابة
أي عدد من الطرق--
قد أفعل ما يلي فقط.

English: 
Then six, then five, then four,
then three, then two, then one.
It's getting smaller, but how
many comparisons is that total?
I've got like n people,
n being a number.
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: Is not
as bad as factorial.
We'd be here all day long.
But it is big.
It is big.
Let's go-- a round of applause,
if we could, for our volunteers.
You can keep the shirts, if
you'd like, as a souvenir.
[APPLAUSE]
Thank you, very much.
Let me see if we can't just kind of
quantify that-- thank you, so much--
and see how we actually
got to that point.
If I go ahead and pull up not our
lockers, but our answers here,
let me propose that what we just
did was essentially two algorithms.
One has the name bubble.
And I was kind of deliberately kind
of shoehorning the word in there.
Bubble sort is just that
comparative sort, pair by pair,
fixing tiny little mistakes.
But we needed to do it
again, and again, and again.
So those steps kind of add up, but
we can express them as pseudocode.
So in pseudocode-- and you can
write this any number of ways--
I might just do the following.

English: 
Just keep doing the following,
until there's no remaining swaps--
from i from 0 to n -2, which is just
n is the total number of humans.
n -2 is go up from that
person to this person,
because I want to compare him or
her against the person next to them.
So I don't want to accidentally do this.
That's why it's n -2 at the end here.
Then I want to go ahead and, if the
ith and the ith +1 elements are out
of order, swap them.
So that's why I was asking our
human volunteers to exchange places.
And then just keep doing that,
until there's no one left to swap.
And by definition, everyone is in order.
Meanwhile, the second algorithm has the
conventional name of selection sort.
Selection sort is literally
just that, where you actually
select the smallest person, or number
of interest to you, intuitively,
again and again.
And the number keeps
getting bigger, but you
start ignoring the people who
you've already put into place.
So the problem, similarly, is
getting smaller and smaller.
Just like in bubble sort, it was
getting more and more sorted.
The pseudocode for selection
sort might look like this.
For i from 0 to n -1,
so that's 0 in an array.

Arabic: 
فقط أستمر في القيام بما يلي،
حتى لا يكون هناك مبادلات متبقية--
من i من 0 إلى n -2،
وn هو العدد الإجمالي للأشخاص.
n -2 تمثل قول اذهب من هذا
الشخص إلي هذا الشخص،
لأنني أرغب فى مقارنته أو
مقارنتها مع الشخص الذي بجانبه/بجانبها.
لذا لا أريد فعل هذا دون قصد.
هذا هو السبب أن n -2 في النهاية هنا.
ثم أريد أن أمضي قدمًا، إذا كانت
العناصر i وi +1
غير مرتبة، فقم بتبديلهم.
ولهذا السبب كنت أطلب من
الأشخاص المتطوعين تبديل أماكنهم.
وأستمر فقط فى متابعة ذلك،
حتى لا يتبقى أحد للتبديل.
وبحسب التعريف، يكون قد تم ترتيب الجميع.
بينما، تحتوي الخوارزمية الثانية
على الاسم التقليدي "selection sort".
"selection sort" هو حرفيًا
حيث تقوم حقًا
بتحديد أصغر شخص، أو رقم
يهمك، بشكل حدسي،
مرارًا وتكرارًا.
ويصبح الرقم
أكبر، لكنك
تبدأ بتجاهل الناس الذين
وضعتهم بالفعل في أماكنهم.
وبالتالي فإن المشكلة،
بالمثل، تصبح أصغر وأصغر.
تمامًا مثل "bubble sort"، كانت تصبح
مرتبة أكثر فأكثر.
قد تبدو التعليمات البرمجية الزائفة
لـ "selection sort" هكذا.
For i from 0 to n -1،
إذًا هذا 0 في مصفوفة.

Arabic: 
وهذا هو n -1.
فقط استمروا في البحث عن أصغر عنصر
بين هذين الكرسيين،
ثم أخرجوا هذا الشخص.
ثم فقط استبعدوا
من هناك أيًا كان-- بدلوهم،
ولكن ليس بالضرورة جانبًا،
فقط بعيد قدر ما هو ضروري.
وبهذه الطريقة، أدير ظهري
إلي المزيد والمزيد من الناس
لأنهم أصبحوا في مكانهم.
إذًا هناك إطاران
مختلفان للمشكلة،
ولكن اتضح أن كليهما في الواقع لديه
عدد الخطوات نفسه، المعطاة أو المأخوذة.
اتضح بشدة أنهما
عدد الخطوات نفسه،
رغم إنهما طريقتان مختلفتان
للتفكير حول هذا الموضوع.
لأني إن فكرت في "bubble sort"،
التكرار الأول، على سبيل المثال،
ما الذي فقط-- فعلاً، حسنًا، دعونا
حتى نفكر في "selection sort".
في "selection sort"، كم
عدد المقارنات التى تعين عليّ فعلها؟
حسنًا، بمجرد عثوري
على عنصري الأصغر،
كان لزامًا عليّ
مقارنته بالجميع.
إذًا هذه n -1 مقارنة
في المرة الأولى.
إذًا n -1 على اللوحة.
ثم يمكنني تجاهلها،
لأنها أصبحت ورائي الآن.
إذًا الآن كم عدد المقارنات
المنتهية من n من الأشخاص لديّ؟
n -2، لأنني قد طرحت واحدة.

English: 
And this is n -1.
Just keep looking for the smallest
element between those two chairs,
and then pull that person out.
And then just evict
whoever's there-- swap them,
but not necessarily adjacently,
just as far away as is necessary.
And in this way, I keep turning
my back on more and more people
because they are then in place.
So two different
framings of the problem,
but it turns out they're actually both
the same number of steps, give or take.
It turns out they're roughly
the same number of steps,
even though it's a different
way of thinking about it.
Because if I think about bubble sort,
the first iteration, for instance,
what just-- actually, well, let's
consider selection sort even.
In selection sort, how many
comparisons did I have to do?
Well, once I found my
smallest element, I
had to compare them
against everyone else.
So that's n -1 comparisons
the first time.
So n -1 on the board.
Then I can ignore them,
because they're behind me now.
So now I have how many
comparisons left out of n people?
n -2, because I subtracted one.

English: 
Then again, n -3, then n -4, all the
way down to just one person remaining.
So I'll express that sort of
generally, mathematically, like this.
So n -1 plus n -2 plus whatever plus
one final comparison, whatever that is.
It turns out that if you actually
read the back of the math
book or your physics textbooks
where they have those little cheat
sheets as to what these recurrences are,
turns out that n -1 plus n -2 plus n -3
and so forth can be
expressed more succinctly
as literally just n
times n -1 divided by 2.
And if you don't recall that, that's OK.
I always look these things up as well.
But that's true-- fact.
So what does that equal out to?
Well, it's like n squared minus
n, if you just multiply it out.
And then if you divide
the two, then it's
n squared divided by 2 minus n over 2.
So that's the total number of steps.
And I could actually plug this in.
We could plug in 8, do the math, and
get the total number of comparisons
that I was verbally
kind of rattling off.
So is that a big deal?
Hm, it feels like it's on
the order of n squared.
And indeed, a computer
scientist, when assessing
the efficiency of an algorithm,
tends not to care too much

Arabic: 
ثم مجددًا، n -3، ثم n -4،
بنفس النسق إلي أن يتبقى شخص واحد.
لذا سأعبر عن هذا النوع
بشكل عام، رياضيًا، هكذا.
إذًا n -1 زائد n -2 زائد أيًا كان زائد
مقارنة واحدة أخيرة، أيًا كانت هذه.
واتضح أنه في الواقع إذا قرأت
الجزء الخلفي من كتاب الرياضيات
أو كتب الفيزياء المدرسية الخاصة بك
حيث لديهم تلك الأوراق المرجعية
بشأن ما تكون عليه تلك التكرارات،
اتضح أن n -1 زائد n -2 زائد n -3
وما إلى ذلك يمكن
التعبير عنهم بشكل أكثر إيجازًا
كحرفيًا فقط n ضرب
n ن-1 مقسومًا على 2.
وإذا لم تتذكر ذلك، لا بأس.
أنا دومًا ما أراجع هذه الأمور أيضًا.
لكن هذا صحيح-- حقًا.
إذًا ما الذي يعادله هذا؟
حسناً، إنه مثل n تربيع
ناقص n، إذا ما ضربته فقط.
ثم إذا قمت بقسمة الاثنين،
يكون
n تربيع مقسومًا على 2 ناقص n على 2.
إذًا هذا هو العدد الإجمالي للخطوات.
ويمكنني بالفعل إدخال هذا فيه.
يمكننا إدخال 8، والقيام بالحسابات،
والحصول على العدد الإجمالي للمقارنات
التي كانت حرفيًا
تزعجني نوعًا ما.
إذًا هل هذا أمر كبير؟
امم، يبدو الأمر كما لو أنه
مرتب بتربيع n.
وفي الحقيقة، عالم الكمبيوتر،
عند تقييمه
فعالية خوارزمية ما،
يميل إلى عدم الاهتمام كثيرًا

English: 
about the precise values.
All we're going to care
about it's the biggest term.
What's the value in the
formula that you come up
with that just dominates the
other terms, so to speak,
that has the biggest effect, especially
as n is getting larger and larger?
Now, why is this?
Well, let's just do sort of
proof by example, if you will.
If this is the expression,
technically, but I
claim that, ugh, it's
close enough to say
on the order of, big O of n squared,
so to speak, let's use an example.
If there's a million people
on stage, and not just eight,
that math works out to
be like a million squared
divided by 2 steps minus a
million divided by 2, total.
So what does that
actually work out to be?
Well, that's 500 billion minus 500,000.
And what does that work out to be?
Well, that's 499 billion,
999 million, 500,000.
That feels pretty darn
close to like n squared.
I mean, that's a drop in the bucket
to subtract 500,000 from 500 billion.
So you know what?
Eh, it's on the order of n squared.

Arabic: 
بالقيم الدقيقة.
كل ما سنهتم به
هو المصطلح الأكبر.
ما هي القيمة التي
تتوصل إليها في الصيغة
التي تهيمن على
المصطلحات الأخرى، إذا جاز التعبير،
التي لها التأثير الأكبر، خاصةً أن
n تصبح أكبر وأكبر؟
الآن، لماذا هذا؟
حسنًا، دعونا نوعًا ما نجري
برهانًا على المثال، إذا صح التعبير.
إذا كان هذا هو التعبير،
من الناحية الفنية، لكني
أزعم أن، آه، إنها
قريبة بما يكفي لنقول
في ترتيب، رمز O الكبير لـ n تربيع،
إذا جاز التعبير، دعونا نستخدم مثالاً.
إذا كان هناك مليون شخص
على خشبة المسرح، وليس فقط ثمانية،
فستكون الحسابات تقريبًا
مليونًا مربعًا
مقسومًا على خطوتين ناقص
مليون مقسومًا على 2، الإجمالي.
إذًا فماذا سينتج
هذا في الواقع؟
حسنًا، هذه 500 مليار ناقص 500,000.
وماذا سينتج هذا في الواقع؟
حسنًا، هذه 499 مليار، 999 مليون، 500,000.
هذا قريب للغاية
من n تربيع مثلاً.
أعني، أن طرح 500,000 من 500 مليار
شىء لا يُذكر.
لذلك أتعلم ماذا؟
أه، إنها في ترتيب n تربيع.

English: 
It's not precise, but it's in
that general order of magnitude,
so to speak.
And so this symbol, this
capital 0, is literally a symbol
used in computer science
and in programming
to just kind of describe
with a wave of the hand,
but some good intuition and algorithm,
how fast or slow your algorithm is.
And it turns out there's different
ways to evaluate algorithms
with just different similar formulas.
n squared happens to be how much
time both bubble sort and selection
sort take.
If I literally count
up all of the work we
were doing on stage
with our volunteers, it
would be roughly n squared, 8
squared, or 64 steps, give or take,
for all of those humans.
And that would be notably off.
There's a good amount
of rounding error there.
But if we had a million
volunteers on stage,
then the rounding error
would be pretty negligible.
But we've actually seen some of
these other orders of magnitude,
so to speak, before.
For instance, when we counted someone,
or we searched for Mike Smith one page
at a time, we called
that a linear algorithm.
And that was big O of n.
So it's on the order of n steps.
It's 1,000.
Maybe it's 999.
Whatever.
It's on the order of n steps.

Arabic: 
هذا ليس دقيقًا، لكنه في
هذا الترتيب العام للمقدار،
إذا جاز التعبير.
وإذًا هذا الرمز، هذا
حرف 0 كبير، هو حرفيًا رمز
مُستخدم في علوم الكمبيوتر
وفي البرمجة
للوصف بإيجاز،
وباستخدام بعض الحدس والخوارزمية الجيدة،
مدى سرعة أو بطء خوارزميتك.
واتضح أن هناك طرق
مختلفة لتقييم الخوارزميات
مع صيغ مماثلة متنوعة فقط.
n تربيع تصادف أن تكون الوقت
الذى استغرقه كلُ من bubble sort
وselection sort.
إذا قمت حرفيًا بعدّ كل الأعمال
التى قمنا بها على خشبة
المسرح مع متطوعينا،
سيكون حوالي n تربيع، 8
تربيع، أو 64 خطوة، معطاة أو مأخوذة،
لجميع هؤلاء الأفراد.
وسيكون هذا خارج السياق بشكل ملحوظ.
هناك كمية لا بأس بها
من خطأ التقريب هناك.
ولكن إذا كان لدينا مليون
متطوع على خشبة المسرح،
إذًا سيصبح خطأ التقريب
مهملاً جدًا.
لكننا رأينا بالفعل بعض من
ترتيبات المقدار الأخرى،
إذا جاز التعبير، مسبقًا.
على سبيل المثال، عندما أحصينا شخصًا ما،
أو بحثنا عن مايك سميث بقلب صفحة واحدة
في كل مرة، سمّينا
هذا خوارزمية خطية.
وكان ذلك حرف O كبير لـ n.
إذًا، إنها في ترتيب خطوات n.
إنها 1000.
ربما تكون 999.
أيًا كان.
إنها في ترتيب خطوات n.

English: 
The [? twosies ?] approach was twice
as fast, recall-- two pages at a time.
But you know what?
That's still linear, right?
Like two pages at a time?
Let me just wait till next
year when my CPU is twice
as fast, because Intel and companies
keep speeding up computers.
The algorithm is fundamentally the same.
And indeed, if you think
back to the picture we drew,
the shapes of those curves
were indeed the same.
That first algorithm, finding Mike
one page at a time looked like this.
Second algorithm finding
him looked like this.
Only the third algorithm, the divide
and conquer, splitting the phone book
was a fundamentally different shape.
And so even though we didn't use
this fancy phrasing a couple of weeks
ago, these first algorithms, one page
at a time, two pages at a time, eh,
they're on the order of n.
Technically, yes, n
versus n divided by 2,
but we only care about the
dominating factor, the variable n.
We can throw away everything
in the denominator,
and we can throw away everything that's
smaller than the biggest term, which
in this case is just n.
And I alluded to this two weeks ago--
logarithmic.
Well, it turns out that any time you
divide something again, and again,

Arabic: 
كان نهج [؟ twosies ؟] أسرع مرتين،
تذكّروا-- صفحتين في كل مرة.
ولكن أتدرون ماذا؟
ما يزال هذا خطي، أليس كذلك؟
مثل صفحتين في آنّ واحد؟
دعوني أنتظر حتى العام القادم
عندما تصبح وحدة المعالجة المركزية أسرع
بمرتين، لأن شركة Intel والشركات
تستمر في تسريع أجهزة الكمبيوتر.
تكون الخوارزمية في الأساس هي نفسها.
وفي الواقع، إذا رجعتم بالذاكرة
إلي الصورة التي رسمناها،
كانت أشكال تلك المنحنيات
هي نفسها في الحقيقة.
الخوارزمية الأولى تلك، العثور على مايك
بقلب صفحة واحدة فى كل مرة كانت هكذا.
الخوارزمية الثانية العثور عليه
كانت هكذا.
فقط الخوارزمية الثالثة، فرق تسد،
وتقسيم دليل الهاتف
كانت شكلاً مختلفاً اختلافًا جذريًا.
وعلى الرغم من أننا لم نستخدم
هذه الصياغة الخيالية منذ بضعة أسابيع
مضت، تلك الخوارزميات الأولى، صفحة
واحدة في كل مرة، صفحتان في كل مرة،
إنهم على ترتيب n.
من الناحية الفنية، نعم، n
مقابل n مقسومًا على 2،
لكننا نهتم فقط بالعامل
المسيطر، المتغير n.
يمكننا التخلص من كل شيء
موجود في المقام،
ويمكننا التخلص من كل ما هو
أصغر من المصطلح الأكبر، الذي
وفي هذه الحالة هو n.
وقد ألمحت إلى هذا قبل أسبوعين--
لوغاريتمي.
حسنًا، اتضح أن في أي وقت تقسم
شيئًا مرارًا

English: 
and again, you're leveraging
a logarithmic type function,
log base 2 technically.
But on the order of log base
n is a common one as well.
The beautiful algorithms are these--
literally, one step, or technically
constant number of steps.
For instance, like what's an
algorithm that might be constant time?
Open phone book.
OK, one step.
Doesn't really matter
how many pages there are,
I'm just going to open the phone book.
And that doesn't vary
by number of pages.
That might be a constant
time algorithm, for instance.
So those are the lowest you can go.
And then there's somewhere
even in between here
that we might aspire to with
certain other algorithms.
So in fact, let's just
see if-- just a moment--
let's just see if we can do
this a little more succinctly.
Let's go ahead and use arrays in just
one final way, using merge sorts.
So it turns out, using
an array, we can actually
do something pretty powerfully,
so long as we allow ourselves
a couple of arrays.

Arabic: 
وتكرارًا، فإنك تحصل على
دالة نوع لوغاريتمي
قاعدة log 2 من الناحية الفنية.
ولكن على ترتيب قاعدة log
فإن n شائع أيضًا.
الخوارزميات الرائعة هي هذه--
حرفيًا، خطوة واحدة، أو
عدد خطوات ثابت من الناحية الفنية.
على سبيل المثال، ما هي
الخوارزمية التي قد تكون وقتًا ثابتًا؟
افتحوا دليل الهاتف.
حسنًا، خطوة واحدة.
لا يهم فى الحقيقة
كم عدد الصفحات هناك،
سأقوم فقط بفتح دفتر الهاتف.
ولا يختلف هذا بحسب
عدد الصفحات.
قد تكون هذه خوارزمية الوقت
الثابت، على سبيل المثال.
إذاً، هذا أقل ما يمكن أن تذهب إليه.
ثم هناك مكان ما
وليكن فى المنتصف هنا
نتطلع إليه مع بعض الخوارزميات الأخرى.
إذًا فى الحقيقة، دعونا نرى
فقط إذا-- لحظة--
دعونا فقط نرى ما إذا كنا بمقدورنا
القيام بهذا بإيجاز أكثر.
دعونا نمضي قدمًا ونستخدم المصفوفات في
طريقة واحدة نهائية فقط، باستخدام أنواع الدمج.
اتضح أن، باستخدام
مصفوفة، يمكننا بالفعل
القيام بأمر كبير للغاية،
طالما أننا نتيح لأنفسنا
زوجين من المصفوفات.

English: 
So again, when we just add sorting
with bubble sort and selection sort,
we had just one array.
We had eight chairs
for our eight people.
But if I actually allowed myself
like 16 chairs, or even more,
and I allowed these
folks to move a bit more,
I could actually do even
better than that using arrays.
So here's some random numbers that we'll
just do visually, without any humans.
And they're in an array, back,
to back, to back, to back.
But if I allow myself
a second array, I'm
going to be able to shuffle these
things around and not just compare them,
because it was those comparisons and
all of my footsteps in front of them
that really started
to take a lot of time.
So here's my array.
You know what?
Just like the phone book-- that
phone book example got us pretty far
in the first week--
let me do half of the problem at a time
and then kind of combine my answer.
So here's an array--
4, 2, 7, 5, 6, 8, 3,
1-- randomly sorted.
Let me go ahead and
sort just half of this,
just like I searched for Mike initially
in just half of the phone book.
So 4, 2, 7, 5-- not sorted.
But you know what?
This feels like too big
of a problem, still.
Let me sort just the left
half of the left half.
OK, now it's a smaller problem.
You know what?

Arabic: 
إذًا مرة أخرى، عندما نضيف sorting
مع bubble sort وselection sort،
فإننا حصلنا على مجموعة واحدة فقط.
كان لدينا ثمانية مقاعد
لأفرادنا الثمانية.
ولكن إذا سمحت بوجود 16
مقعدًا مثلاً أو أكثر،
وسمحت لهؤلاء الأشخاص
بالتحرك أكثر قليلاً،
سيمكنني بالفعل القيام بما هو
أفضل من ذلك باستخدام المصفوفات.
إذاً هذه بعض الأرقام العشوائية التي سنقوم بها
بشكل مرئي دون استخدام أى أشخاص.
وهم في مصفوفة، متصلين على التوالي.
ولكن إذا أتحت لنفسي
مصفوفة ثانية، سأكون
قادرًا على خلط هذه الأشياء
وليس مقارنتهم فقط،
لأن هذه المقارنات
وجميع خطواتي صوبهم
التي بدأت تستنفد
الكثير من الوقت بالفعل.
إذًا ها هى مصفوفتي.
أتعلمون ماذا؟
تمامًا مثل دليل الهاتف--
مثال دليل الهاتف هذا الذى حصلنا عليه سابقًا
في الأسبوع الأول--
دعوني أعالج نصف المشكلة
في وقت واحد ثم أجمع إجابتي نوعًا ما.
إذًا ها هى مصفوفة--
4، 2، 7، 5، 6، 8، 3،
1-- تم ترتيبها بشكل عشوائي.
دعوني أمضي قدمًا
وأرتب نصفهم فقط،
تمامًا مثلما بحثت عن مايك في البداية
في منتصف دليل الهاتف فقط.
إذًا 4، 2، 7، 5-- لم يتم ترتيبهم.
ولكن أتدرون ماذا؟
هذا يبدو وكأنه ما يزال
مشكلة كبيرة للغاية.
دعوني أرتب النصف الأيسر
من النصف الأيسر.
حسنًا، الآن أصبحت المشكلة أصغر.
أتعلمون؟

English: 
4 and 2, still out of order.
Let me just divide this list of two
into two tiny arrays, each of size 1.
So here's a mini-array of size 1,
and then another one of like size
7, but they're back
to back, so whatever.
But this array of size 1, is it sorted?
AUDIENCE: No.
DAVID J. MALAN: I'm sorry?
AUDIENCE: No.
DAVID J. MALAN: No?
If this array has just one
element and that element is 4--
AUDIENCE: There's only
one thing you can do.
DAVID J. MALAN: Yes, then
it is sorted, by definition.
All right, so done.
Making some progress.
Now, let me kind of mentally rewind.
Let me sort the right
half of that array.
So now I have another array of size 1.
Is this array sorted?
Yeah, kind of stupidly.
We don't really seem
to be doing anything.
We're just making claims.
But yes, this is sorted.
But now, this was the original half.
And this half is sorted.
This half is sorted.
What if I now just kind of
merge these sorted halves?
I've got two lists of size 1--
4 and 2.
And now if I have extra storage
space, if I had like extra benches,
I could do this a little better.

Arabic: 
4 و2، ما يزالان غير مرتبين.
دعوني أقسم هذه القائمة الثنائية
إلى مصفوفتين صغيرتين، كل واحدة من الحجم 1.
إذًا، ها هنا مصفوفة صغيرة بحجم 1،
وأخرى بحجم
7، ولكنهم متصلين على
التوالي، أيًا كان.
لكن هذه المصفوفة
من الحجم 1، هل تم ترتيبها؟
الجمهور: لا.
ديفيد ج. مالان: معذرةً؟
الجمهور: لا.
ديفيد ج. مالان: لا؟
إذا كان لدى هذا المصفوفة عنصر واحد فقط
وهذا العنصر هو 4--
الجمهور: لا يوجد سوى
شيء واحد يمكنك القيام به.
ديفيد ج. مالان: نعم، إذًا
تم ترتيبها، حسب التعريف.
حسنًا، إذًا تمت.
حققنا بعض التقدم.
الآن، دعوني أقم بتنشيط ذاكرتكم قليلاً.
دعوني أرتب النصف
الأيمن من تلك المصفوفة.
إذًا الآن لديّ مصفوفة أخرى من الحجم 1.
هل يتم ترتيب هذه المصفوفة؟
نعم، بغباء نوعًا ما.
يبدو حقًا أنه لا يتعين
علينا فعل أي شيء.
نحن فقط نقوم بمحض افتراضات.
بلى، تم ترتيب هذا.
لكن الآن، كان هذا هو النصف الأصلي.
وتم ترتيب هذا النصف.
تم ترتيب هذا النصف.
ماذا لو قمت الآن بدمج هذه
الأنصاف المرتبة نوعًا ما؟
لديّ قائمتان بحجم 1--
4 و2.
والآن إذا كان لديّ مساحة تخزين إضافية،
إذا كان لديّ مقاعد إضافية،
يمكنني القيام بهذا بشكل أفضل قليلاً.

English: 
don't I go ahead and merge
these two as follows?
2 will go there.
4 will go there.
So now I've taken two sorted lists
and made one bigger, more sorted list
by just merging them together,
leveraging some additional space.
Now, let me mentally rewind.
How did I get to 4 and 2?
Well, I started with the left half,
then the left half of the left half.
Let me now do the right half
of the left half, if you will.
All right, let me divide this again.
7, list of size 1, is it sorted?
Yes, trivially.
5, is it sorted?
Yes.
7 and 5, let's go ahead
and merge them together.
5 is, of course, going to go here.
7, of course, is going to go here.
OK.
Now where do we go?
We originally sorted the left half.
Let's go sort the right-- oh, right.
Sorry.
Now, we have the left half.
And the right half of
the left half are sorted.
Let's go ahead and merge these.
We have two lists now of size 2--
2, 4 and 5, 7, both of which are sorted.
If I now merge 2, 4 and 5, 7,
which element should come first
in the new longer list, obviously?

Arabic: 
ماذا إن مضيت قدمًا ودمجت
هذين على النحو التالي؟
ستذهب 2 إلى هناك.
ستذهب 4 إلى هناك.
إذًا الآن لقد أخذت قائمتين مرتبتين
وأنشئت واحدة أكبر، قائمة أكثر ترتيبًا
فقط عن طريق دمجهما معًا،
واكتساب بعض المساحة الإضافية.
الآن، دعوني أقم بتنشيط ذاكراتكم.
كيف وصلت إلى 4 و2؟
حسنًا، لقد بدأت بالنصف الأيسر،
ثم بالنصف الأيسر من النصف الأيسر.
دعوني أتولى النصف الأيمن
من النصف الأيسر، إذا صح التعبير.
حسناً، دعوني أُقَسم هذا مجدداً.
7، قائمة بالحجم 1، هل تم ترتيبها؟
نعم، ببساطة.
5، هل تم ترتيبها؟
نعم.
7 و5، دعونا نمضي قُدمًا
وندمجهما سويًا.
5، بالطبع ، ستذهب إلى هنا.
7، بالطبع، ستذهب إلى هنا.
حسنًا.
الآن، إلى أين وصلنا؟
نحن في الأصل رتبنا النصف الأيسر.
دعونا نرتب الأيمن-- أوه، الأيمن.
معذرةً.
الآن، لدينا النصف الأيسر.
وتم ترتيب النصف الأيمن
من النصف الأيسر.
دعونا نمضي قُدمًا وندمج هؤلاء.
لدينا قائمتان الآن بحجم 2--
تم فرز كل من، 2 و4 و5 و7.
إذا قمت الآن بدمج 2 و4 و5 و7،
أى عنصر ينبغي أن يأتي أولاً
في القائمة الكبيرة المطولة، بوضوح؟

Arabic: 
2.
ثم 4، ثم 5، ثم 7.
لم يكن أمرًا شاقًا.
لكن حسنًا، نحن فقط نستخدم
مساحة أكثر قليلاً في مصفوفتنا.
الآن ماذا بعد؟
الآن، دعونا نفعل النصف الأيمن.
مرة أخرى، بدأنا بتناول المشكلة كلها،
والقيام بالنصف الأيسر،
والنصف الأيسر من النصف الأيسر، والنصف الأيسر
للنصف الأيسر من النصف الأيسر.
والآن سنرجع بالزمن، إذا صح التعبير.
إذًا دعونا نقسم هذا إلى
نصفين، ومايزال إلى الآن النصف الأيسر
فى نصفين.
6 تم ترتيبها.
8 تم ترتيبها.
الآن يتعين عليّ دمجهما--
6، 8.
الآن ماذا بعد؟
النصف الأيمن-- 3 و1.
حسنًا، تم ترتيب النصف الأيسر،
تم ترتيب النصف الأيمن--
1 و3.
حسنًا، كيف يمكنني الآن دمج هؤلاء؟
6، 8، 1، 3، أي عنصر من الواضح
يُفترض أن يأتي أولاً؟
1، ثم 3، ثم 6، ثم 8.
ثم أخيرًا، لديّ
قائمتان بحجم أربعة.
دعوني أمنح نفسي مساحة صغيرة أكثر،
ومصفوفة أخرى.
والآن دعوني أمضي قدمًا وأضع
1 و2 و3 و4 و5،
و6 و7 و8.
ما الذي حدث للتو؟

English: 
2.
And then 4, then 5, and then 7.
That wasn't much of anything.
But OK, we're just using a
little more space in our array.
Now what comes next?
Now, let's do the right half.
Again, we started by taking the
whole problem, doing the left half,
the left half of the left half, the left
half of the left half of the left half.
And now we're going back
in time, if you will.
So let's divide this into two
halves, now the left half into two
halves still.
6 is sorted.
8 is sorted.
Now I have to merge them--
6, 8.
What comes next?
Right half-- 3 and 1.
Well, left half is sorted,
right half is sorted--
1 and 3.
All right, now how do I merge these?
6, 8, 1, 3, which element
should obviously come first?
1, then 3, then 6, then 8.
And then lastly, I have
two lists of size four.
Let me give myself a little
more space, one more array.
Now let me go ahead and put
1, and 2, and 3, and 4, and 5,
and 6, and 7, and 8.
What just happened?

Arabic: 
لأنه حدث في الواقع كثيرًا بشكل أسرع،
رغم أننا كنا نقوم بذلك
كله لفظيًا.
حسنًا لاحظوا، كم عدد المرات
التي قام بها كل رقم بتغيير أماكنه؟
حرفيًا ثلاث مرات، أليس كذلك؟
مثل واحد، اثنان، ثلاثة، صحيح؟
انتقلت من المصفوفة الأصلية، إلى المصفوفة
الثانية، إلى المصفوفة الثالثة،
إلى المجموعة الرابعة،
أيًا كان ما يسمّى.
ثم صارت في مكانها فى نهاية المطاف.
إذًا كان يتعين على كل رقم أن يتحرك
واحدة، اثنتين، ثلاثة نقاط.
ثم كم عدد الأرقام هناك؟
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: حسنًا، لقد كانوا
بالفعل في المجموعة الأصلية.
كم عدد المرات التي تعين عليهم الانتقال؟
فقط مرة، اثنتين، ثلاثة.
إذًا، كم عدد الأجمالي للأرقام
هناك، فقط للتوضيح؟
هناك ثمانية.
إذًا 8 ضرب 3.
إذًا دعونا نعمم هذا.
إذا كان هناك أرقام n،
وكل مرة قمنا بنقل
الأرقام التي فعلناها حوالي
نصفهم، من النصف، ثم النصف، حسنًا،
كم مرة يمكنك قسمة 8 على 2؟
8 تذهب إلى 4.
4 تذهب إلى 2.
2 تذهب إلى 1.
ولهذا السبب وصلنا للمستوى الأدنى
في عنصر واحد، قوائم الحجم 1.

English: 
Because it actually happened a lot
faster, even though we were doing this
all verbally.
Well notice, how many times did
each number change locations?
Literally three, right?
Like one, two, three, right?
It moved from the original array, to the
secondary array, to the tertiary array,
to the fourth array,
whatever that's called.
And then it was ultimately in place.
So each number had to move
one, two, three spots.
And then how many numbers are there?
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: Well, they were
already in the original array.
So how many times do they have to move?
Just one, two, three.
So how many total numbers
are there, just to be clear?
There's eight.
So 8 times 3.
So let's generalize this.
If there's n numbers,
and each time we moved
the numbers we did like half of
them, than half, then half, well,
how many times can you divide 8 by 2?
8 goes to 4.
4 goes to 2.
2 goes to 1.
And that's why we bottomed out
at one element, lists of size 1.

English: 
So it turns out whenever you divide
something by half, by half, by half,
what is that function or formula?
Not power, that's bad.
That's the other direction.
AUDIENCE: [INAUDIBLE]
DAVID J. MALAN: It's a logarithm.
So again, logarithm is just
a mathematical description
for any function that you keep dividing
something again, and again, and again.
In half, in half, in half, in third,
in third, in third, whatever it is,
it just means division by the
same proportional amounts again,
and again, and again.
And so if we move the numbers
three times, or more generally log
of n times, which again just
means you divided n things again,
and again, and again,
you just call that log n.
And there's n numbers,
so n numbers moved
log n times, the total
arithmetic here in question
is one of those other values on
our little cheat sheet, which
looked like this.
In our other cheat sheet, recall that
we had formulas that looked like this,
not just n squared and n, and log n,
and 1, we have this one in the middle--
n times log n.
So again, we're kind
of jumping around here.

Arabic: 
إذًا اتضح أنه كلما قمت بتقسيم
شيء إلى النصف، إلى النصف، إلى النصف،
ما هذه الدالة أو الصيغة؟
ليست "power"، هذا سيء.
هذا هو البعد الآخر.
الجمهور: [INAUDIBLE]
ديفيد ج. مالان: إنه لوغاريتم.
إذًا مرة أخرى، اللوغاريتم هو فقط
وصف رياضي
لأية دالة تبقيك تقسم
شيئاً ما مرارًا وتكرارًا.
إلى النصف، إلى النصف، إلى النصف، إلى الثلث،
إلى الثلث، إلى الثلث، أيًا كان هو،
وتعني فقط التقسيم
بالكميات النسبية نفسها،
مرارًا وتكرارًا.
ولذا إذا قمنا بتحريك الأرقام
ثلاث مرات، أو بشكل عام سجل
مرات n، التي تعني مجدّدًا
تقسيمك لأشياء n مرارًا،
وتكرارًا،
يمكنك فقط تسميت هذا بسجل n.
ويوجد أرقام n،
إذًا قامت أرقام n بنقل
سجل مرات n،الحساب
الإجمالي هنا في السؤال
هو واحد من تلك القيم الأخرى فى
ورقة الملاحظات لدينا، والتي
تبدو مثل هذا.
في ورقة الملاحظات لدينا، تذكّروا
أنه كان لدينا صيغ تبدو مثل هذه،
ليس مجرد n تربيع وn،وlog n
و1، لدينا هذا في المنتصف--
n ضرب log n.
إذًا مجدّدًا، إننا نمضي
سريعًا نوعًا ما هنا.

Arabic: 
ولكن مجدّدًا، كل رقم
يتحرك في مواقع log n.
يوجد المجموع الإجمالي لأرقام n.
إذًا n ضرب log n يكون،
حسب التعريف، n log n.
ولكن لماذا تم فرز هذا بهذه الطريقة؟
حسنًا log n، تذكّروا في الأسبوع الأول
من مثال دليل الهاتف،
المنحنى الأخضر هو بالتأكيد أصغر
من n. n كانت الخطوط المستقيمة،
كان log n هو المنحنى الأخضر.
إذًا في الواقع ينتمي هذا إلى
كليهما لأن هذا هو n ضرب n.
هذا n.
هذا n ضرب
شيء ما أصغر من n.
الآن ما هو الأثر الفعلي؟
حسنًا، إذا كان علينا تشغيل
هذه الخوارزميات جنبًا إلى جنب
ومقارنتهم في الواقع
بشيء مثل هذا--
دعوني أمضي قدمًا وأقارن هذه الخوارزميات
باستخدام هذا العرض التوضيحي هنا--
إذا مضيت قدمًا، وضغطت على تشغيل،
سنرى أن الأشرطة في هذا المخطط
هي أفقية في الواقع.
والأشرطة الصغيرة
تمثل الأرقام الصغيرة،
الأشرطة الكبيرة تمثل الأرقام الطويلة.
ثم يقوم كل واحد منهما بتشغيل
خوارزمية مختلفة-- selection
sort على اليسار، bubble
sort فى المنتصف،
merge sort، كما سنسميها الآن،
على اليمين.

English: 
But again, each number
moves log n places.
There's n total numbers.
So n times log n is just,
by definition, n log n.
But why is this sorted this way?
Well log n, recall from week
0 with the phone book example,
the green curve is definitely smaller
than n. n was the straight lines,
log n was the green curved one.
So this indeed belongs in between,
because this is n times n.
This is n.
This is n times
something smaller than n.
So what's the actual implication?
Well, if we were to run
these algorithms side by side
and actually compare them
with something like this--
let me go ahead and compare these
algorithms using this demo here--
if I go ahead and hit play, we'll
see that the bars in this chart
are actually horizontal.
And the small bars
represent small numbers,
large bars represent long numbers.
And then each of these is going to
run a different algorithm-- selection
sort on the left, bubble
sort in the middle,
merge sort, as we'll now
call it, on the right.

English: 
And here's how long each of
them take to sort those values.
Bubble's still going.
Selection's still going.
And so that's the appreciable
difference, albeit with a small demo,
between n squared and
something like log n.
And so what have we done here?
We've really, really, really got into
the weeds of what arrays can actually
do for us and what the relationships
are with strings, because all of it
kind of reduces to just things being
back, to back, to back, to back.
But now that we kind
of come back, and we'll
continue along this
trajectory next time to be
able to talk at a much higher level
about what's actually going on.
And we can now take this
even further, by applying
other sort of forms of media to
these same kinds of questions.
And we'll conclude it's
about 60 seconds long.
These bars are vertical,
instead of horizontal.
And what you'll see
here is a visualization
of various sorting algorithms,
among them selection sort, bubble
sort, and merge sort, and a whole
assortment of others, each of which
has even a different sound
to it because of the speed
and the pattern by which
it actually operates.
So let's take a quick look.
[VIDEO PLAYBACK]
[MUSIC PLAYING]

Arabic: 
وإليك كم يستغرق كل
واحد منهم لترتيب هذه القيم.
ما تزال Bubble مستمرة.
ما تزال Selection مستمرة.
وهذا هو الاختلاف الملموس،
وإن كان هناك عرض توضيحي صغير،
بين n تربيع
وشيء مثل log n.
إذًا ماذا فعلنا هنا؟
نحن، حقًا للغاية مشغولين بتفاصيل
ما يمكن أن تقوم به المصفوفة في الواقع
لنا وما هي العلاقات
مع السلاسل، لأن كل ذلك
يقلل من اتصال الأشياء
مع بعضها على التوالي.
ولكننا سنعود الآن نوعًا ما
وسنتابع
باستمرار هذا المسار
في المرة القادمة ليمكنني
التحدث على مستوى أعلى بكثير
حول ما يجري في الواقع.
ويمكننا الآن التحدث فى هذا
بتعمق، من خلال تطبيق
نوع آخر من أشكال الوسائط إلى
هذه الأنواع نفسها من الأسئلة.
وسنستنتج أنه يستغرق
حوالي 60 ثانية.
هذه الأشرطة عمودية،
بدلاً من أن تكون أفقية.
وما سترونه
هنا هو تصور
ترتيبات مختلفة لخوارزميات،
من بينهم selection sort،
وbubble sort، وmerge sort،وكل ترتيبات
البقية، كل منهم
لديه صوت مختلف له
بسبب السرعة
والنمط الذي تعمل من خلاله
بالفعل.
إذًا دعونا نلقي نظرة سريعة.
[VIDEO PLAYBACK]
[MUSIC PLAYING]

English: 
This is bubble sort.
And you can see how the larger elements
are indeed bubbling up to the top.
[?
And you can kind of
hear the ?] periodicity,
or the cycle that it's going in.
And there's less, and less, and less,
and less work to do, until almost--
This is selection sort now.
So it starts off random, but we
keep selecting the smallest human
or, in this case, the shortest bar.
And you'll see here the bars
correlate with frequency, clearly.
So it's getting higher and
higher and taller and taller.
This is merge sort now which,
recall, does things in halves,
and then halves of halves,
and then merges those halves.

Arabic: 
هذا هو bubble sort.
ويمكنكم رؤية أن العناصر الكبيرة
تتزحزح بالفعل إلى الأعلى.
[؟
ويمكنكم سماع [؟ صوت
توالي الدورات نوعًا ما،
أو الدورة التي تدور فيها.
وهناك عمل قليل للغاية
للقيام به، حتى تقريبًا--
هذا هو selection sort الآن.
إذًا يبدأ بشكل عشوائي، لكننا
نواصل اختيار الأفراد أصحاب العدد الأصغر
أو، في هذه الحالة، الشريط الأقصر.
وسترى هنا أن الأشرطة
ترتبط بالتردد بشكل واضح.
إذاً هي تصبح أعلى
وأعلى وأطول وأطول.
هذا هو merge sort الآن تذكّروا،
الذي، يقسم الأشياء إلى أنصاف،
ثم أنصاف الأنصاف،
ثم يدمج تلك الأنصاف.

Arabic: 
إذًا قمنا بعمل الجزء الأيسر كله،
وتقريبًا عمل الجزء الأيمن كله.
هذا الجزء ممتع جدًا.
[LAUGHS]
هذا شيء يسمّى [؟ nom ؟]
sort, ويقوم بتحسين الأمور.
ليس مثاليًا تمامًا، ولكنه
دائمًا ما يحقق تقدمًا للأمام،
ثم الرجوع للخلف على نحو
مضاعف نوعًا ما ومحو الأشياء.
[END PLAYBACK]
آه.
كان هذا كثيرًا.
دعونا نتوقف هنا.
سأبقى هنا لبعض الوقت
من أجل الأسئلة الفردية.
حسنًا أراكم المرة القادمة.
[APPLAUSE]

English: 
So we just did all the left
work, almost all the right work.
That one's very gratifying.
[LAUGHS]
This is something called [? nom ?]
sort, which is improving things.
Not quite perfectly, but it's
always making forward progress,
and then kind of doubling
back and cleaning things up.
[END PLAYBACK]
Whew.
That was a lot.
Let's call it a day.
I'll stick around for
one-on-one questions.
We'll see you next time.
[APPLAUSE]
