[Powered by Google Translate] [تجول - مجموعة مشكلة 4] [Zamyla تشان - جامعة هارفارد] [هذا CS50. - CS50.TV] حسنا. مرحبا، الجميع، ومرحبا بكم في الإرشادات التفصيلية 4. اليوم لدينا هو pset الطب الشرعي. الطب الشرعي هو حقا متعة pset التي تنطوي على التعامل مع ملفات الصورة النقطية اكتشاف من ارتكب الجريمة. ثم ونحن في طريقنا لتغيير حجم الصورة النقطية بعض الملفات، ثم ونحن في طريقنا أيضا للتعامل مع الجزء الممتع حقا يسمى استرداد، التي تبحث في الأساس نحن سلمت بطاقة الذاكرة الذي كان شخص ما قد بطريق الخطأ حذف كافة الملفات الخاصة بهم، وطلب منا لاستعادة هذه الملفات. ولكن أولا، قبل أن ندخل في pset، أنا حقا لا يريدون سوى أن أهنئ الجميع. نحن على وشك في منتصف هذه الدورة. مسابقة 0 هو وراءنا، ونحن في pset4، أساسا كان الأمر كذلك، نحن في منتصف الطريق. لقد قطعنا شوطا طويلا إذا كنت ننظر إلى الوراء إلى psets الخاص بك، وpset0 pset1، أهنئ نفسك حتى عن ذلك، ونحن في طريقنا للوصول الى بعض الاشياء حقا متعة. لذلك لدينا الأدوات لهذا pset، مرة أخرى، بدلا من تشغيل سودو يم ص التحديث، نحن قادرون على مجرد تشغيل update50 إذا كنت في النسخة 17.3 وما فوق من الأجهزة. لذا يجب التأكد من تشغيل update50 - انها أسهل كثيرا، وحرف أقل القليل - للتأكد من أن كنت في أحدث نسخة من الجهاز. خاصة وأنه من المهم أن update50 عندما نبدأ باستخدام CS50 تحقق. لذا تأكد من أن تفعل ذلك. لجميع الأقسام لهذا pset، ونحن في طريقنا إلى أن التعامل مع ملف المدخلات والمخرجات، وملف I / O. ونحن في طريقنا إلى أن تخطى الكثير من البرامج التي تتعامل مع المصفوفات مشيرا إلى الملفات واشياء من هذا القبيل، لذلك نحن نريد أن نتأكد من أننا على دراية حقا ومريحة التعامل مع كيفية الإدخال والإخراج في الملفات. في التعليمات البرمجية لهذا التوزيع هو pset ملف يسمى copy.c، وهذا ما نحن ذاهبون للعثور ستكون مفيدة حقا بالنسبة لنا لأننا ذاهبون الى نهاية المطاف في الواقع نسخ الملف copy.c وتغيير طفيف فقط لتكون قادرة على تحقيق أول 2 أجزاء من مجموعة المشكلة. وحتى ذلك الحين كما ذكرت من قبل، ونحن نتعامل مع الصور النقطية وكذلك ملفات JPEG. لذلك فهم حقا هيكل كيف يتم تنظيم هذه الملفات، كيف يمكننا ترجمة حقا و 0s 1s في البنيات والأشياء التي يمكننا أن نفهم الواقع وتفسير وتعديل، والتي ستكون ذات أهمية كبيرة، الذهاب إلى ذلك JPEG وملفات الصورة النقطية وفهم بنية هذه. Pset4، كالعادة، يبدأ القسم من الأسئلة. سوف تعامل مع تلك الملفات I / O وتحصل اعتادوا على ذلك. ثم الجزء 1 هو المجرم، الذي كنت تحصل على ملف صورة نقطية التي تبدو مثل نوع من النقط الحمراء في كل مكان. ثم أساسا ما نحن بصدد القيام به هو اتخاذ هذا الملف وتحرير فقط قليلا في نسخة نتمكن من قراءتها. أساسا، وبمجرد أن تنتهي، سيكون لدينا نفس الملف، إلا سنكون قادرين على رؤية رسالة خفية مخبأة من قبل جميع تلك النقاط الحمراء. ثم تغيير الحجم هو البرنامج الذي، نظرا ملف وقدمت بعد ذلك اسم الملف الذي عليه المخرجات وقدمت بعد ذلك عددا كذلك، وسيتم تغيير حجم الصورة النقطية في الواقع أن من تلك القيمة عدد صحيح. وأخيرا ثم، لدينا pset استرداد. ونظرا لاننا بطاقة الذاكرة وبعد ذلك لاسترداد جميع الصور التي تم حذفها عن طريق الخطأ، ولكن، كما سنقوم تعلم، لا يتم حذف فعلا وإزالتها من ملف؛ خسرنا مجرد نوع من حيث كانوا في الملف، ولكن ونحن في طريقنا لاستعادة ذلك. كبيرة. الذهاب لذلك في ملف I / O على وجه التحديد، وهذه هي قائمة كاملة من الوظائف التي سوف تستخدم. كنت قد رأيت بالفعل قليلا أساسيات الدالة fopen، fread، وfwrite، ولكن ونحن في طريقنا للبحث أكثر في بعض الملفات I / O وظائف مثل fputc، تكتب فيها حرف واحد فقط في كل مرة، لfseek، حيث كنت نوع من تحريك مؤشر الملف موقف الأمام وإلى الوراء، وبعد ذلك بعض الآخرين. ولكن سوف نذهب إلى أن قليلا في وقت لاحق خلال pset. أولا حتى، فقط للوصول الى ملف I / O قبل أن نذهب إلى pset، لفتح ملف، على سبيل المثال، ما عليك القيام به في الواقع تم تعيين مؤشر إلى هذا الملف. لذلك لدينا مؤشر FILE *. في هذه الحالة، وأنا اصفا اياه بانه في مؤشر لأن ذلك سيكون INFILE بلدي. وهكذا انا ذاهب الى استخدام الدالة fopen وظيفة وفوق اسم الملف ومن ثم الوضع الذي أنا ذاهب إلى أن التعامل مع الملف. ولذلك لا يوجد "ص" في هذه الحالة لقراءة، "W" للكتابة، ثم "ألف" لإلحاق. على سبيل المثال، عندما كنت تتعامل مع INFILE وكل ما تريد القيام به هو قراءة البتات والبايتات المخزنة هناك، ثم كنت على الارجح الى تريد استخدام "ص" كما وضع الخاص بك. عندما تريد الكتابة فعلا، نوع من جعل ملف جديد، ثم ما نحن بصدد القيام به هو أننا ذاهبون لفتح ملف جديد واستخدام "ث" واسطة للكتابة. حتى بعد ذلك عندما كنت تقرأ الواقع في ملفات، وهيكل هو كما يلي. الأولى التي تشمل المؤشر إلى البنية التي سوف تحتوي على وحدات البايت التي كنت تقرأ. بحيث سيكون الموقع نهاية البايتات التي كنت تقرأ. ثم كنت تريد الذهاب للإشارة إلى حجم، مثل كيفية العديد أساسا بايت برنامج لديه لقراءة الملف في ل، وحجم عنصر واحد هو أساسا، ثم كنت تريد الذهاب لتحديد عدد العناصر التي ترغب في قراءتها. ثم أخيرا، عليك أن تعرف أين كنت تقرأ من، بحيث سيكون المؤشر في. I مرمزة لهذه fread هو أيضا مشابهة جدا لfwrite، إلا أنت ترغب في التأكد من أن استخدام حق النظام، تأكد من أن كنت تكتب في الواقع لأو قراءة من الملف الصحيح. حتى ذلك الحين كما كان من قبل، إذا كان لدينا حجم عنصر فضلا عن عدد من العناصر، بعد ذلك يمكننا اللعب في جميع أنحاء هنا قليلا. ويقول لدي البنية DOG وحتى ذلك الحين أريد أن قراءة اثنين من الكلاب في كل مرة. ما يمكن القيام به هو القول حجم عنصر واحد سيكون حجم كلب واحد وانا ذاهب الى قراءة الواقع اثنين منهم. بدلا من ذلك، ما يمكن أن تفعله هو يقول أنا ذاهب لمجرد قراءة عنصر واحد وأحد العناصر التي ستكون في حجم اثنين من الكلاب. ولهذا كيف يمكنك مماثلة النوع من اللعب حولها مع حجم وعدد اعتمادا على ما هو أكثر سهولة بالنسبة لك. حسنا. حتى الآن نصل إلى ملفات الكتابة. عندما تريد كتابة ملف، الوسيطة الأولى هو في الواقع حيث كنت تقرأ من. بحيث في الاساس على البيانات التي أنت ذاهب لكتابة في ملف، وهو مؤشر في نهاية. حتى عندما كنت تتعامل مع pset، تأكد من لا تحصل على الخلط. ربما يكون الجانب التعاريف إلى جنب. يمكنك سحب تعريفات تصل في دليل بكتابة الرجل ثم fwrite، على سبيل المثال، في المحطة، أو يمكنك الرجوع إلى هذه الشريحة وتأكد من أنك تستخدم حق واحد. ذلك مرة أخرى، لfwrite، عندما يكون لديك الملف الذي تريد أن تكتب فيه، وهذا سوف يكون آخر حجة، وأنه سيكون مؤشر إلى هذا الملف. حتى ذلك الحين هذه هي الطريقة التي نتعامل بها مع الكتابة ربما بايت عدة في وقت واحد، ولكن نقول لكم تريد أن تكتب حرف واحد فقط في واحدة فقط. كما سنرى لاحقا في هذا المثال، في الصور النقطية سوف يتعين علينا استخدام ذلك. وذلك عندما نتمكن من استخدام fputc، أساسا مجرد وضع حرف واحد في كل مرة، مركز حقوق الإنسان، في مؤشر الملف، وهذا مؤشر إلى شعبنا هناك. لذلك كلما ثم نسعى أو الكتابة في ملف، الملف يتم تتبع ما نحن فيه. لذلك هو نوع من المؤشر، ومؤشر وضع الملف. وهكذا كلما نكتب مرة أخرى أو قراءة في ملف، الملف يتذكر الواقع حيث هو، وهكذا يستمر من حيث المؤشر. وهذا يمكن أن يكون مفيدا عندما تريد، مثلا، نقرأ في كمية معينة أن تفعل شيئا ثم قراءة في الكميات التالية، لكن في بعض الأحيان قد نريد أن نعود أو في الواقع بدء من القيمة المرجعية معينة. حتى ذلك الحين وظيفة fseek، ما تقوم به هو يسمح لنا لتحريك المؤشر في ملف معين عدد معين من وحدات البايت. ثم ما يتعين علينا القيام به هو تحديد المكان هو القيمة المرجعية. لذلك يتحرك إما إلى الأمام أو الخلف من حيث المؤشر حاليا، أو يمكننا تحديد أنه يجب أن تتحرك فقط في من بداية الملف أو من نهاية الملف. وهكذا يمكنك تمرير القيم في سلبية أو إيجابية لالمبلغ، ، وسوف هذا النوع من نقل المؤشر إما إلى الأمام أو الوراء. قبل أن ندخل في psets أخرى، على أية أسئلة الملف I / O؟ حسنا. ونحن ندخل في مزيد من الأمثلة، لا تتردد في وقف لي لطرح الأسئلة. حتى في الروايات البوليسية، كنت سلمت لك ملف صورة نقطية مشابهة لهذه واحدة حمراء على الشريحة، ويبدو أن هذا - مجموعة من النقط الحمراء - وكنت لا أعرف حقا ما هو مكتوب. إذا كنت أحول، قد تكون قادرا على رؤية اللون المزرق طفيف داخل الوسط. أساسا، وهذا حيث يتم تخزين النص. كان هناك القتل التي حدثت، ونحن بحاجة لمعرفة من فعل ذلك. من أجل القيام بذلك، نحن بحاجة إلى نوع من تحويل هذه الصورة إلى تنسيق قابل للقراءة. إذا يا رفاق اجهت أي وقت مضى هذا، في بعض الأحيان لن يكون هناك مجموعات صغيرة حيث سيكون لديك عدسة مكبرة مع فيلم الحمراء. أي شخص؟ نعم. لذلك أنت سيكون شيئا سلم مثل هذا، سيكون لديك عدسة مكبرة مع الفيلم الحمراء أكثر من ذلك، وكنت وضعه فوق الصورة، وسوف تكون قادرا على رؤية رسالة خفية فيه. ونحن لم يكن لديك عدسة مكبرة مع فيلم الأحمر، وذلك بدلا نحن ذاهبون الى خلق نوع من منطقتنا في هذا pset. وبالتالي فإن المستخدم هو الذهاب الى المجرم الإدخال، ثم فكرة. BMP، بحيث هو INFILE، هذه هي الرسالة النقطة الحمراء، ثم انهم يقولون verdict.bmp سيكون لدينا OUTFILE. لذلك سيكون لخلق صورة نقطية جديدة مشابهة لفكرة آن واحد إلا في شكل قابل للقراءة حيث يمكننا أن نرى رسالة خفية. لأننا سنتعرض لتحرير والتعامل مع الصور النقطية التلاعب من نوع ما، نحن ذاهبون الى نوع من الغوص في داخل بنية هذه الملفات نقطية. ذهبنا قليلا على هذه قليلا في المحاضرة، ولكن دعونا ننظر إلى بعض منهم أكثر من ذلك. الصور النقطية هي أساسا مجرد ترتيب بايت حيث قمنا المحددة التي بايت يعني ما. حتى هنا نوع من مثل خريطة للصورة نقطية وقالت انها تبدأ مع بعض الملفات رأس، يبدأ بعض المعلومات في هناك. ترى أنه في حوالي 14 بايت عدد يشار حجم الصورة النقطية، وأنها لا تزال على. ولكن بعد ذلك ما كنت مهتما حقا نحن هنا بدأت حول عدد البايت 54. لدينا هذه مثلثات RGB. ما الذي يجري القيام به هو احتواء بكسل الفعلية، وقيم الألوان. كل شيء أعلاه أن في رأس بعض المعلومات المقابلة لحجم الصورة، وعرض الصورة، وارتفاع في. عندما نذهب إلى الحشو في وقت لاحق، وسنرى لماذا حجم الصورة قد يكون مختلفا عن عرض أو ارتفاع في. حتى ذلك الحين لتمثيل هذه - هذه الصور النقطية هي متواليات من البايت - ما يمكن القيام به هو القول حسنا، انا ذاهب لنتذكر أنه في مؤشر 14، حيث ان حجم، على سبيل المثال، ولكن بدلا من ذلك ما نحن بصدد القيام به لجعل هذا أسهل وتغلف ذلك في البنية. وهكذا لدينا اثنين من البنيات التي بالنسبة لنا، وBITMAPFILEHEADER وBITMAPINFOHEADER، وهكذا كلما قرأنا في هذا الملف ل، افتراضيا انها سوف يحدث في النظام، وذلك من أجل انه سيكون أيضا لملء إلى متغيرات مثل biWidth وbiSize. ثم أخيرا، يتم تمثيل كل بكسل من ثلاثة بايت. أول واحد هو مقدار الأزرق في بكسل، والثاني هو مقدار الخضراء، وأخيرا، فإن المبلغ من الأحمر، حيث 0 هو في الأساس ليست خضراء زرقاء أو حمراء أو لا لا ثم وما يليها هي القيمة القصوى. هذه هي القيم الست عشرية. حتى ذلك الحين اذا كان لدينا FF0000، ثم الذي يتوافق مع الحد الأقصى للمبلغ من اللون الأزرق ومن ثم لا يوجد الأخضر والأحمر، حتى ذلك الحين من شأنه أن يقدم لنا بكسل الأزرق. ثم اذا كان لدينا جميع FF على كافة القطاعات، فإن ذلك يعني أن لدينا بكسل الأبيض. هذا هو نوع من عكس عادة عندما نقول RGB. انه سيكون في الواقع BGR. لذلك إذا نظرنا في الواقع إلى مثال صورة نقطية - اسمحوا لي سحب واحد هنا. انها صغيرة قليلا. أنا في التكبير، ويمكننا أن نرى انها منقطة ذلك. يبدو كتل من الألوان. لديك كتل بيضاء وحمراء ثم كتل. إذا كنت تلعب في الرسام، على سبيل المثال، هل يمكن أن تجعل شيئا من هذا القبيل بواسطة طلاء الأساس مجرد مربعات في ترتيب معين. لذلك فما هذا يترجم إلى الصورة النقطية في النحو التالي. هنا لدينا بكسل البيضاء الأولى، التي هي في كل 6 و، ثم لدينا بكسل الأحمر، يتبين من 0000FF. وهكذا تسلسل بايت التي لدينا تشير إلى الصورة النقطية كيف سوف تنظر. ذلك ما فعلته هنا هو مكتوب للتو كل هذه بايت والملونة ثم في الحمراء بحيث يمكنك رؤية نوع من ذلك، إذا كنت أحول قليلا، كيف هذا النوع من يشير إلى وجود وجه مبتسم. الطريقة التي النقطية صور العمل أتصور أنه أساسا في شكل شبكة. وذلك بشكل افتراضي، كل صف من الشبكة يجب أن يكون من مضاعفات 4 بايت. إذا نظرنا إلى صورة نقطية، كنت ملء كل قيمة. على سبيل المثال، قد يكون لديك أحمر هنا، خضراء هنا، زرقاء هنا، ولكن لديك للتأكد من أن يتم تعبئة الصورة في عدة مع أربعة بايت. لذلك إذا كنت أريد أن أكون صورة ثلاث كتل واسعة، ثم كنت أود أن يكون لوضع قيمة فارغة في آخر لجعله متعددة من أربعة. حتى ذلك الحين أود أن أضيف شيئا في الذي نحن نطلق الحشو. انا فقط للإشارة إلى أن هناك مع س. الآن يقولون نريد الصورة التي هو 7 بكسل طويلة، على سبيل المثال. لدينا 1، 2، 3، 4، 5، 6، 7، ويتم تعبئة كل ذلك في مع اللون. الطريقة التي تعمل الصور النقطية هو أننا بحاجة إلى 8. الآن لدينا 1، 2، 3، 4، 5، 6، 7. نحن حاجة 8 مساحات للصورة نقطية لقراءة بشكل صحيح. حتى ذلك الحين ما علينا القيام به هو إضافة في بت واحد فقط من الحشو للتأكد من أن كل من الاعراض موحدة وأن جميع الاعراض هي من مضاعفات 4. وهكذا أشرت سابقا، باعتبارها حشوة X أو خط متعرج، ولكن في الصور النقطية الفعلية يشار إلى الحشو من قبل A 0 الست عشري. ذلك من شأنه أن يكون حرف واحد، 0. ما قد تأتي في متناول اليدين هو الأمر xxd. ما تقوم به هو في الواقع يظهر لك، مثل على غرار ما فعلت من قبل مع وجه مبتسم عندما طبعت فعلا ما سيكون لكل لون بكسل لل ثم مرمزة ذلك، عند تشغيل xxd مع الأوامر التالية، بعد ذلك سوف طباعة فعلا ما هي الألوان لتلك بكسل. ما عليك القيام به هو أكثر من هنا I تشير، مثل ليالي-54 يقول أنا ذاهب لبدء في البايت 54 لأن قبل ذلك، تذكر إذا نظرنا إلى خريطة الصور النقطية، هذا كل معلومات رأس واشياء من هذا القبيل. ولكن ما يهمنا حقا هو بكسل الفعلية التي تدل على اللون. ذلك عن طريق إضافة في هذا العلم، و-S 54، ثم نحن قادرون على مشاهدة القيم اللون. ولا تقلق بشأن الأعلام معقدة واشياء من هذا القبيل. في مشكلة المواصفات مجموعة، سيكون لديك توجيهات حول كيفية استخدام xxd لعرض بكسل. لذلك إذا كنت ترى هنا، انها نوع من يشبه الصندوق الأخضر، وهذا شيء صغير. لقد مرمزة في 00ff00 قوله أساسا أي الزرقاء، والكثير من الأخضر والأحمر لا. بحيث يتوافق مع الأخضر. كما ترون هنا، نرى المستطيل الأخضر. هذا هو المستطيل الأخضر فقط 3 بكسل، ثم فما علينا فعله للتأكد من أن الصورة هي متعددة واسعة من 4 في الحشو هو إضافة اضافية. وحتى ذلك الحين هذه هي الطريقة التي ترى هذه 0S هنا. سيكون هذا في الواقع نتيجة لتغيير حجم pset الخاص بك، أخذ أساسا نقطية صغيرة ثم توسيع ذلك بنسبة 4. وذلك ما نراه في الواقع هو أن هذه الصورة هي 12 بكسل، ولكن 12 هو من مضاعفات الرقم 4، ولذا فإننا في الواقع لا أرى أي 0S في نهاية لأننا لسنا في حاجة لإضافة أي لأنه مبطن بالكامل. أنه ليس لديه أي غرفة أكثر من ذلك. حسنا. أي أسئلة حول الحشو؟ حسنا. بارد. كما ذكرت من قبل، والصور النقطية هي مجرد تسلسل بايت. وهكذا ما لدينا هو بدلا من الحاجة إلى تتبع عدد من البايت الذي بالضبط يتوافق مع عنصر معين، ونحن في الواقع قد خلقت البنية لتمثيل ذلك. ذلك ما لدينا هو بنية RGBTRIPLE. كلما كان لديك مثيل الثلاثي RGB، لأن هذا هو نوع تعريف البنية، ثم يمكنك الوصول إلى متغير rgbtBlue، وبالمثل، فإن المتغيرات الأخضر والأحمر، والتي سوف تبين مدى الأزرق، والأخضر، والأحمر على التوالي، لديك. إذا كان الأمر كذلك لدينا مجموعة متغير اللون الأزرق إلى 0، مجموعة الأخضر لوما يليها، التي هي القيمة الحد الأقصى الذي يمكن أن يكون، ثم المتغير الأحمر تعيين إلى 0، ثم ماذا لون RGB هذا الثلاثي يمثل خاصة؟ >> [طالب] الأخضر. الأخضر. بالضبط. انها سوف يكون من المفيد معرفة أنه كلما كان لديك مثيل الثلاثي RGB، يمكنك الوصول فعلا مبلغ اللون - أزرق، أخضر، أحمر و- بشكل منفصل. والآن بعد أن تحدثنا عن هيكل ذلك، دعونا نلقي نظرة على الملف BMP. هذه هي البنيات جعل لكم. هنا لدينا البنية BITMAPFILEHEADER. من هو حجم الفائدة. في وقت لاحق، لدينا معلومات رأس، والتي لديها أكثر الأشياء القليلة التي هي مثيرة للاهتمام بالنسبة لنا، وهي حجم، عرض، وارتفاع في. ونحن سوف تذهب إلى وقت لاحق، عندما تقرأ في إلى الملف، يقرأ تلقائيا في لأننا تعيين لتكون هي نفسها. وبالتالي فإن biSize تحتوي على بايت الحق التي تتوافق مع الحجم الفعلي للصورة. ثم هنا، وأخيرا، كما تحدثنا عنه، لدينا البنية RGBTRIPLE typedef. لدينا rgbtBlue، أخضر، أحمر والمرتبطة به. كبيرة. حسنا. والآن بعد أن نفهم الصور النقطية قليلا، نفهم أن لدينا رأس الملف ورأس معلومات المرتبطة به ثم بعد ذلك، لدينا الاشياء من الألوان، ويتم تمثيل هذه الألوان من خلال البنيات RGBTRIPLE، وهذه، بدورها، ثلاثة القيم المرتبطة إلى الأزرق، والأخضر، والأحمر. حتى الآن، لا يسعنا نوع من التفكير حول استرداد قليلا. آسف. التفكير المجرم. عندما يكون لدينا ملف لدينا دليل، ثم ما نريد القيام به هو قراءة له في بكسل بكسل ثم قم بتغيير إلى حد ما تلك بكسل حتى نتمكن من إخراج قبل ان تتحول الى شكل قابل للقراءة. وذلك لإخراج ذلك، ونحن في طريقنا لكتابة بكسل بكسل في ملف verdict.bmp. وهذا النوع من الكثير مما يجب عمله. ونحن ندرك ذلك. وذلك ما فعلناه هو أننا في الواقع قد قدمت لكم مع copy.c. ما يفعله هو copy.c فقط يجعل صورة طبق الأصل من ملف صورة نقطية معين وثم إخراجها. ولذلك فإن هذا يفتح الملف بالفعل بالنسبة لك، يقرأ في بكسل بكسل، ويكتب بعد ذلك في في ملف الإخراج. دعونا نلقي نظرة على ذلك. هذا هو ضمان الاستخدام السليم، الحصول على أسماء هنا. هذا ما يفعله هو أنه يضع ملف الإدخال أن تكون ما كنا صدر في في INFILE هنا، وهو الثانية لدينا سطر الأوامر الوسيطة. الفحص للتأكد من أننا يمكن فتح الملف. الفحص للتأكد من أننا يمكن أن تقدم OUTFILE جديد هنا. ثم هذا ما يفعله هنا، فإنه يبدأ في الأساس مجرد القراءة في لملف الصورة النقطية من البداية. بداية، كما نعلم، يحتوي على BITMAPFILEHEADER، وهكذا فإن هذه تسلسل من البتات ملء مباشرة في BITMAPFILEHEADER. فما لدينا هنا يقول ان BF BITMAPFILEHEADER - هذا المتغير الجديد من نوع BITMAPFILEHEADER - ونحن في طريقنا لوضع داخل BF ما نقرأ من مؤشر في، وهو INFILE لدينا. كم منا يقرأ؟ نقرأ في عدد البايتات نحن بحاجة لاحتواء BITMAPFILEHEADER كله. وبالمثل، وهذا ما نقوم به لرأس معلومات. لذلك نحن لدينا مستمرة على طول الملف في INFILE، وإننا نقرأ هذه البتات والبايتات، ونحن بشكل مباشر في توصيل في هذه الحالات من المتغيرات التي نحن نحقق. هنا نحن على يقين من أن مجرد جعل الصورة النقطية صورة نقطية. الآن لدينا OUTFILE، أليس كذلك؟ وذلك لأنها تقف عندما كنا إنشائه، انها فارغة أساسا. لذلك لدينا أساسا لإنشاء صورة نقطية جديدة من نقطة الصفر. ما نقوم به هو أننا يجب أن نتأكد من أننا في رأس نسخ الملف ورأس معلومات تماما مثل INFILE لديها. ما نقوم به هو نكتب - وتذكر أن BF هو المتغير من BITMAPFILEHEADER نوع، لذلك ما نقوم به هو أننا مجرد استخدام هذا المحتوى لكتابة في OUTFILE. هنا، تذكر تحدثنا عن الحشو، كيف أنه من المهم للتأكد من أن كمية بكسل الذي لدينا هو من مضاعفات الرقم 4. هذه هي صيغة مفيدة جدا لحساب مقدار الحشو لديك نظرا لعرض الملف. أريدك أن تتذكر أن الرجال في copy.c لدينا صيغة لحساب الحشو. حسنا؟ لذلك تذكر أن الجميع. كبيرة. ثم ماذا في ذلك هل copy.c المقبل هو بالتكرار على كل من خطوط المسح. وغني عن طريق الصفوف أولا ثم يخزن كل ثلاثة أضعاف أنه يقرأ ويكتب بعد ذلك في OUTFILE. حتى هنا ثم إننا نقرأ واحد فقط RGB الثلاثي في ​​وقت ووضع بعد ذلك أن نفس الثلاثي في ​​OUTFILE. الجزء صعبة هو أن الحشو ليست الثلاثي RGB، وهكذا لا يمكننا أن مجرد قراءة هذا المبلغ يتضاعف ثلاث مرات من الحشو RGB. ما يتعين علينا القيام به هو في الواقع مجرد تحرك مؤشر موقفنا الملف، تحرك المؤشر لدينا، لنوع من الحشو تجاوز كل ذلك أننا في الصف التالي. ثم هذا ما يفعله هو نسخة وتبين لكم كيف قد ترغب في إضافة الحشو. حتى لقد حسبنا كم نحن بحاجة الحشو، وهذا يعني أننا في حاجة عدد من الحشو 0S. هذا ما يفعله هو أن يضع لحلقة الحشو من عدد 0S في OUTFILE لدينا. وأخيرا ثم يمكنك إغلاق كل الملفات. إغلاق INFILE وكذلك في OUTFILE. لذلك هذه هي الطريقة التي يعمل copy.c، والتي ستكون مفيدة جدا. في الواقع بدلا من مجرد نسخ ولصق مباشرة من أو مجرد النظر اليها والكتابة في كل ما تريد، قد ترغب فقط لتنفيذ هذا الأمر في الطرفية، حزب المحافظين copy.c whodunit.c، والتي سوف إنشاء ملف جديد، whodunit.c، الذي يحتوي على المحتوى الدقيق نفس نسخة لا. حتى ذلك الحين ما يمكننا القيام به هو استخدام هذا كإطار التي تبنى عليها وتحريرها لدينا ملف المجرم. هذه هي جهدنا ل-DOS للقيام المجرم ل، ولكن هل ما copy.c ويأخذ فعلا رعاية معظمهم بالنسبة لنا. لذلك كل ما نحتاج القيام به هو التالي تغيير بكسل حسب الحاجة لجعل الملف للقراءة الواقع. تذكر أن لبكسل نظرا الثلاثي، وذلك لمتغير نوع معين من RGBTRIPLE، يمكنك الوصول إلى الأزرق، والقيم الأخضر، والأحمر. هذا ما سوف يأتي في متناول اليدين لأنه إذا كنت يمكن الوصول إليها، وهذا يعني أنه يمكنك أيضا التحقق منها، وهذا يعني أنه يمكنك أيضا تغيير عليها. حتى عندما عدنا إلى المثال لدينا الحمراء المكبرة الزجاج، في الأساس، هو أن يتصرف كنوع من تصفية بالنسبة لنا. ذلك ما نريد القيام به هو أننا نريد لتصفية كل من مثلثات التي تأتي فيها. هناك عدة طرق مختلفة للقيام بذلك. في الأساس، هل يمكن أن يكون أي نوع من التصفية التي تريدها. ربما كنت ترغب في تغيير جميع بكسل الأحمر أو ربما كنت ترغب في تغيير لون بكسل مختلفة للون مختلف. هذا متروك لكم. تذكر أنك يمكن أن تحقق ما هو لون بكسل وبعد ذلك يمكنك أيضا تغيير ذلك كما كنت يمر بها. حسنا. ولهذا المجرم. بمجرد تشغيل المجرم، عليك أن تعرف من هو المجرم من الجريمة هو. الآن ونحن في طريقنا للذهاب إلى تغيير حجم. نحن ذاهبون الى يزال من الممكن التعامل مع الصور النقطية. ما نحن بصدد القيام به هو أننا ستكون لدينا نقطية المدخلات ثم ونحن في طريقنا لتمرير في عدد ومن ثم الحصول على صورة نقطية OUTFILE حيث أن لدينا في الاساس INFILE تحجيم بواسطة N. ويقول ملفي كان مجرد بكسل واحد كبير. ثم إذا كان لي ن 3، التحجيم بنسبة 3، ثم أود أن أكرر أن بكسل N عدد من المرات، لذلك 3 مرات، ثم توسيع نطاق كما عليه 3 مرات أيضا. حتى ترى أنا التوسع بشكل عمودي كذلك أفقيا و. ثم هنا هو مثال على ذلك. إذا كان لديك ن = 2، ترى أن هناك بكسل 1 الأزرق المتكررة مرتين أفقيا وكذلك رأسيا مرتين. ثم الذي لا يزال على، وهكذا كان لديك زيادة مباشرة من الصورة الأصلية قبل اثنين. ثم حتى إذا كنا بالتفاصيل في pseudocode لهذا، نحن نريد لفتح الملف. وثم معرفة أنه إذا عدنا هنا، ونحن نرى أن عرض لOUTFILE ستكون مختلفة من عرض لINFILE. ماذا يعني ذلك؟ وهذا يعني أن المعلومات التي لدينا رأس سيتغير. وذلك ما كنا نرغب في القيام به هو تحديث معلومات الرأس، مع العلم أنه عندما نقرأ في الملفات إذا كنت تعمل على الإطار copy.c، لدينا بالفعل متغير تشير إلى ما هو حجم واشياء من هذا القبيل. حتى مرة واحدة لديك ذلك، ما قد ترغب في القيام به هو تغيير هذه المتغيرات خاصة. تذكر، إذا كان لديك البنية، وكيف يمكنك الوصول إلى متغيرات داخل تلك. استخدام المشغل نقطة، أليس كذلك؟ ثم ذلك باستخدام ذلك، كنت أعرف أنك سوف تحتاج إلى تغيير معلومات رأس. حتى هنا مجرد قائمة من العناصر الفعلية التي هي على وشك أن يتغير في الملف الخاص بك. حجم الملف سوف يتم تغيير، صورة، وكذلك العرض والارتفاع و. ذلك يحدث ثم العودة إلى خريطة الصور النقطية، النظر في ما اذا كان رأس ملف أو معلومات رأس الذي يحتوي على المعلومات ثم قم بتغيير حسب الحاجة. مرة أخرى، ويقول حزب المحافظين copy.c resize.c. وهذا يعني أن يحتوي resize.c الآن كل ما الواردة داخل نسخة لأن نسخة يوفر لنا وسيلة لقراءة كل بكسل في scanline لللمن بكسل. إلا الآن، بدلا من مجرد تغيير القيم كما فعلنا في رواية جريمه، ما نريد القيام به هو أننا نريد أن يكتب في عدة بكسل طالما لا يوجد لدينا أكبر من 1. ثم ما نريد القيام به هو أننا نريد أن تمتد أفقيا بواسطة N، فضلا تمتد عموديا لأنه بواسطة N. كيف يمكن لنا أن نفعل ذلك؟ يقول ن بك هو 2 وكان لديك هذا INFILE معين. المؤشر سوف تبدأ في أول واحد، وماذا تريد أن تفعل إذا كان n هو 2، التي تريد طباعتها في 2 من هؤلاء. لذلك قمت بطباعة في 2 من هؤلاء. ثم المؤشر الخاص بك هو الذهاب للانتقال إلى بكسل المقبل، الذي هو واحد أحمر، وانه سيكون لطباعة 2 من تلك الحمراء منها، وضعها على إلحاق ما فعلت ذلك من قبل. ثم فسوف يتحرك المؤشر إلى بكسل المقبل وجذب 2 من تلك. إذا نظرت إلى إطار copy.c، هذا ما يفعله هنا ويقوم بإنشاء مثيل جديد من الثلاثي RGB، متغير جديد يسمى الثلاثي. وعندما يقرأ هنا إلى ذلك، فإنه يقرأ من RGBTRIPLE 1 INFILE ويخزنها داخل هذا المتغير ثلاثية. حتى ذلك الحين كان لديك فعلا أن يمثل متغير بكسل معينة. ثم عند الكتابة، ما قد ترغب في القيام به هو غلف البيان fwrite في حلقة For أن يكتب عليه إلى OUTFILE الخاص عدة مرات حسب الحاجة. هذا بسيط. فقط تكرار عملية الكتابة أساسا ن عدد المرات لتوسيع نطاق أفقيا. ولكن بعد ذلك علينا أن نتذكر أن لدينا الحشو هو الذهاب الى تغيير. في السابق، ويقول كان لدينا شيء من طول 3. ثم نضيف فقط في مقدار الحشو؟ واحد فقط أكثر لجعلها متعددة من 4. لكنهم يقولون نحن توسيع نطاق هذه الصورة خاصة بواسطة N = 2. حتى ذلك الحين كيف العديد من بكسل الأزرق لدينا في نهاية المطاف؟ سيكون لدينا 6. 1، 2، 3، 4، 5، 6. حسنا. 6 ليست من مضاعفات 4. ما هو أقرب مضاعف من 4؟ وهذا سوف يكون 8. لذلك نحن ذاهبون فعلا لدينا 2 من الأحرف الحشو هناك. لا أحد يتذكر اذا كان لدينا صيغة لحساب الحشو وحيث قد يكون ذلك؟ [رد الطالب غير مسموع] >> نعم، copy.c. الحق. هناك صيغة في copy.c لحساب مقدار الحشو لديك نظرا لعرض خاص للصورة نقطية. ثم بحيث ستكون مفيدة عندما تحتاج لإضافة في كمية معينة من الحشو لمعرفة مدى فعلا الحشو تحتاج إلى إضافة. ولكن واحدة علما، رغم ذلك، هو أنك ترغب في التأكد من أن كنت تستخدم الحجم الصحيح. فقط كن حذرا لأنك ستكون في الاساس التعامل مع اثنين من الصور النقطية. تريد للتأكد من أن كنت تستخدم حق واحد. عندما كنت حساب الحشو لOUTFILE، كنت ترغب في استخدام عرض OUTFILE وليس عرض واحد السابقة. كبيرة. هذا النوع من يعتني تمتد صورة نقطية كله أفقيا. ولكن ما نريد القيام به هو فعلا تمتد عموديا أيضا. هذه ستكون اصعب قليلا لأننا عندما تنتهي من نسخ على التوالي والكتابة هذا الصف، لدينا المؤشر ستكون في نهاية المطاف. إذا كان الأمر كذلك نقرأ مرة أخرى، ثم انها مجرد الذهاب الى قراءة في إلى السطر التالي. ذلك ما نريد القيام به هو نوع من إيجاد طريقة ما لنسخ تلك الصفوف مرة أخرى أو مجرد نوع من أخذ هذا الصف ومن ثم إعادة كتابة من جديد. وأنا ألمح إلى نوع من، وهناك عدة طرق مختلفة للقيام بذلك. ما يمكن أن تفعله هو وأنت تسير من خلال القراءة وخاصة من خلال scanline لل وتغييره عند الضرورة، ثم نوع من المتجر كل تلك بكسل في صفيف. ثم في وقت لاحق كنت تعرف أنك سوف تحتاج إلى طباعة إلى أن مجموعة مرة أخرى، وهكذا يمكنك فقط استخدام هذا الصفيف للقيام بذلك. طريقة أخرى للقيام بذلك هو هل يمكن نسخ أسفل صف واحد، نفهم أن تحتاج إلى نسخ ذلك مرة أخرى، لذلك تحرك المؤشر في الواقع، والتي ستكون باستخدام fseek الأسلوب. هل يمكن أن تحرك المؤشر كل في طريق العودة ثم كرر عملية النسخ مرة أخرى. حتى إذا لدينا عدد التحجيم هو ن، ثم كم مرة علينا أن نعود وإعادة كتابة سطر؟ >> [طالب] ن - 1. نعم >>، والكمال. ن - 1. لقد فعلت ذلك بالفعل مرة واحدة، ثم لذلك سوف نريد تكرار عملية رجعة فيه ن - 1 كمية من المرات. حسنا. هناك حتى لديك وظيفة الخاص بك تغيير الحجم. الآن يمكن أن نحصل على جزء حقا متعة، pset المفضلة، والذي هو استرداد. بدلا من الصور النقطية، وهذه المرة نتعامل مع ملفات JPEG. كنت في الواقع نحن لم تعط ملف صور JPEG فقط من، كنت أعطيت لنا أساسا بطاقة ذاكرة الخام الشكل. وحتى هذا يحتوي على القليل من القيم معلومات والقمامة في البداية، وبعد ذلك يبدأ ولها مجموعة من الملفات JPEG. ومع ذلك، كنت سلمت لنا بطاقة حيث قمنا حذف الصور؛ أساسا، لقد نسينا حيث توجد الصور داخل البطاقة. حتى ذلك الحين مهمتنا في استرداد هو أن يذهب من خلال هذا الشكل بطاقة وتجد هذه الصور مرة أخرى. لحسن الحظ، وهيكل من ملفات JPEG وملف البطاقة قليلا مفيدة. بالتأكيد يمكن أن يكون اصعب قليلا لو لم يكن في هذا الشكل بالذات. كل ملف JPEG يبدأ فعلا مع اثنين من متواليات ممكن، المذكورة أعلاه. في الأساس، وكلما كان لديك ملف JPEG جديدة، ويبدأ مع تسلسل إما ffd8 ffe0 أو الآخر، ffd8 ffe1. شيء آخر هو المفيد أن نعرف أن يتم تخزين ملفات JPEG متاخم. لذلك كلما JPEG الملف ينتهي، والآخر يبدأ المرء. حتى لا يكون هناك أي نوع من لا في الفترات الفاصلة بين القيم هناك. ضرب بمجرد بدء JPEG، إذا كنت قد تم بالفعل قراءة JPEG، هل تعلم أن كنت قد بلغت نهاية سابقتها وبدء المرحلة التالية. لتصور هذا النوع من، قدم لي التخطيطي. آخر شيء عن ملفات JPEG هو أن نتمكن من قراءتها في متواليات من 512 بايت في كل مرة، وبالمثل مع بداية البطاقة. نحن لسنا بحاجة إلى أن فحص كل بايت واحد لأن ذلك تمتص. بدلا من ذلك، ما يمكننا القيام به هو في الواقع مجرد قراءة في 512 بايت في كل مرة ومن ثم، بدلا من التدقيق في تلك بين شرائح في تلك الصغير للغاية، يمكننا التحقق فقط من بداية بايت 512. أساسا، في هذه الصورة، ماذا أنت ترى في بداية البطاقة، لديك القيم التي ليست ذات صلة حقا إلى ملفات JPEG الفعلية نفسها. ولكن بعد ذلك ما قلته هو نجم للإشارة إلى واحدة من اثنين متواليات انطلاق لJPEG. لذلك كلما رأيت نجما، وتعلمون أن لديك ملف JPEG. ثم كل ملف JPEG ستكون بعض متعددة من 512 بايت ولكن ليس بالضرورة نفس متعددة. الطريقة التي كنت تعرف أن كنت قد ضرب آخر هو JPEG إذا كنت ضرب نجم آخر، آخر تسلسل بدء بايت. ثم ما لديك هنا هو أن يكون لديك ملف JPEG الأحمر استمرار حتى تصل نجم، يشار التي كتبها لون جديد. ضرب لكم كنت لا تزال ثم ضرب نجم آخر، وآخر JPEG، كنت لا تزال على طول الطريق حتى النهاية. كنت في آخر صورة هنا، واحد الوردي. تذهب إلى نهاية حتى تصل إلى نهاية حرف الملف. هذا سيكون مفيدا حقا. A الوجبات السريعة القليلة الرئيسي هنا: بطاقة الملف لا يبدأ مع JPEG، ولكن مرة واحدة في JPEG يبدأ، يتم تخزين كافة ملفات JPEG جنبا إلى جنب مع بعضها البعض. بعض شبة الكود لاسترداد. أولا، نحن في طريقنا لفتح ملف لدينا بطاقة، والتي ستكون لدينا باستخدام ملف I / O وظائف. ونحن في طريقنا لتكرار العملية التالية حتى لقد وصلت إلى نهاية الملف. ونحن في طريقنا لقراءة 512 بايت في المرة الواحدة. وما قلته هنا هو أننا في طريقنا لتخزينها في المخزن المؤقت، وذلك أساسا على عقد لأولئك 512 بايت حتى نعرف بالضبط ماذا تفعل معهم. ثم ما نريد القيام به هو أننا نريد للتحقق ما إذا كنا قد ضرب نجم أم لا. إذا كنا قد ضرب نجم، واذا كنا قد ضرب واحدة من سلاسل البداية، ثم نحن نعلم أن لدينا ملف JPEG ضرب جديد. ما سنقوم تريد القيام به هو اننا سوف ترغب في إنشاء ملف جديد في الدليل لدينا pset4 على مواصلة تقديم هذا الملف. ولكن أيضا، إذا حققنا بالفعل قبل JPEG، ثم نريد أن ينتهي هذا الملف ودفعها إلى المجلد pset4، حيث سيتعين علينا أن ملف مخزن لأننا إذا لم تحدد بعد أن قمنا انتهت بأن JPEG الملف، فلن تكون لدينا أساسا مبلغ غير محدد. فإن ملفات JPEG تنتهي أبدا. لذلك نحن نريد أن نتأكد من أننا عندما كنت تقرأ في ملف JPEG إلى والكتابة التي، نحن نريد لإغلاق تحديدا أنه من أجل فتح واحد القادم. سنقوم تريد أن تحقق العديد من الأشياء. نريد للتحقق ما إذا كان نحن في بداية جديدة مع JPEG العازلة لدينا وأيضا إذا كنا بالفعل قد وجدت قبل JPEG لأن من شأنها أن تغير عملية الخاص بك قليلا. ثم بعد ذلك تذهب من خلال كل الطريق وضرب لكم في نهاية الملف، ثم ما عليك تريد القيام به هو سترغب لإغلاق كافة الملفات المفتوحة حاليا. والتي ستكون على الأرجح ملف JPEG الماضي ان لديك، فضلا عن ملف البطاقة التي كنت قد تم التعامل معها. العقبة الأخيرة أننا بحاجة إلى معالجة في كيفية جعل ملف JPEG الواقع وكيفية دفع فعلا إلى المجلد. وpset يتطلب أن كل JPEG أن تجد تكون في الشكل التالي، حيث لديك الرقم. JPG. عدد، حتى لو كان 0، نسميها 000.jpg. كلما تجد JPEG في البرنامج، كنت تريد الذهاب الى تسميته في الترتيب الذي وجدت عليه. ماذا يعني هذا؟ نحن بحاجة إلى نوع من تتبع عدد وجدنا وما يجب أن يكون عدد كل JPEG يكون. هنا ونحن في طريقنا للاستفادة من وظيفة sprintf. مماثلة إلى printf، الذي مجرد نوع من يطبع قيمة للخروج الى المحطة، طباعة الملف من sprintf إلى المجلد. وذلك ما يمكن أن تفعل هذا إذا كان لي sprintf، والعنوان، ومن ثم هناك السلسلة، فإنه طباعة 2.JPG. على افتراض أن كنت أغلقت ملفاتي بشكل صحيح، والتي تحتوي على الملف الذي كنت قد تم كتابة بها. لكن شيئا واحدا هو أن التعليمات البرمجية التي لدي هنا لا يلبي تماما ما يتطلب pset. وpset يتطلب أن يجب أن تكون تسمية الملف JPEG 2 002 بدلا من 2 فقط. لذلك عندما تقوم بطباعة الاسم، ثم ربما قد ترغب في تغيير العنصر النائب قليلا. لا أحد يتذكر كيف نسمح لمسافات إضافية عندما كنا طباعة شيء ما؟ نعم. >> [طالب] يمكنك وضع لمدة 3 بين علامة النسبة المئوية و 2 في. نعم >>، والكمال. عليك وضع 3 في هذه الحالة لأننا نريد مساحة لل3. و3D٪ يعطون ربما كنت 002.jpg بدلا من 2. الوسيطة الأولى إلى الدالة sprintf هو في الواقع مجموعة شار، التي عرفناها سابقا باسم السلاسل. تلك الإرادة، نوع من أشبه التخزين المؤقت، تخزين فقط السلسلة الناتجة. فلن يكون حقا التعامل مع هذا، ولكن تحتاج إلى تضمين ذلك. مع العلم أن كل اسم ملف يحتوي على عدد، والتي تشكل ثلاثة أحرف، وبعد ذلك. jpg، كيف ينبغي أن تكون طويلة هذه المجموعة؟ طرد عدد. عدد الأحرف في العنوان، في الاسم؟ لذلك هناك 3 hashtags، الفترة، JPG. >> [طالب] 7. >> 7. ليس تماما. ونحن في طريقنا إلى 8 لأن نريد نريد للسماح فاصل فارغة أيضا. وأخيرا، لمجرد استخلاص العملية التي عليك أن تفعل لاسترداد، لديك بعض المعلومات البداية. كنت لا تزال حتى تجد بداية من ملف JPEG، ويمكن أن يكون أي واحد من اثنين من سلاسل البداية. عليك أن تبقي على القراءة. كل مائل هنا يمثل 512 بايت. عليك أن تبقي على القراءة، والحفاظ على القراءة حتى واجهت سلسلة أخرى البداية. وبمجرد الانتهاء من ذلك، يمكنك إنهاء JPEG الحالي - في هذه الحالة، انها واحدة حمراء، لذلك أنت تريد إنهاء ذلك. تريد اسم sprintf من ذلك في مجلد pset4، ثم تريد فتح JPEG جديدة ومن ثم الحفاظ على القراءة حتى واجهت المقبل. تبقي على القراءة، والحفاظ على القراءة، ثم أخيرا، في نهاية المطاف، وأنت تسير لتصل إلى نهاية الملف، وهكذا لن تضطر تريد إغلاق JPEG الماضي ان كنت تعمل مع، sprintf ذلك في مجلد pset4، وبعد ذلك ننظر في جميع الصور التي كنت قد حصلت. هذه الصور هي في الواقع صور لCS50 الموظفين، وهكذا هذا هو المكان الجزء الممتع من مكافأة pset يأتي في هو أنك تنافس في أقسام للعثور على TFS في الصور والتقاط الصور معهم لإثبات أن كنت قد فعلت pset وحتى تتمكن من معرفة أي الموظفين هي في الصور. حتى ذلك الحين كنت تأخذ الصور مع الموظفين. أحيانا سيكون لديك لمطاردة عليهم. ربما البعض منهم سوف يحاول أن يهرب منك. كنت التقاط الصور معهم. هذه لا تزال مستمرة. انها ليست بسبب pset عندما يعود. وسيتم الإعلان عن الموعد النهائي في المواصفات. ثم مع القسم الخاص بك، أيهما يأخذ معظم القسم الصور ومع معظم الموظفين فوز بجائزة رهيبة جدا. وهذا النوع من الحوافز للحصول على الانتهاء pset4 الخاص في أسرع وقت ممكن لأن ثم يمكنك الشروع في العمل مطاردة جميع أعضاء مختلفة من الموظفين CS50. هذا ليس إلزاميا، ورغم ذلك بمجرد الحصول على الصور، ثم تنتهي مع pset4. وأنا انتهيت مع تجول 4، لذلك أشكركم جميعا على حضوركم. حظا سعيدا مع الطب الشرعي. [تصفيق] [CS50.TV]