دیوید مالان: همه حق، خوش آمدید. این CS50 است. این آغاز هفت هفته است. پس از آن در حالی که، بنابراین من فکر کردم ما یک تور گردباد که در آن ما ترک کردن و جایی که ما در حال رفتن است. بنابراین این چیزی که در اینجا ممکن است باعث شده است برخی از احساس وحشت و نگرانی در ابتدا. اما امیدوارم، شما شروع به به آب و هوای جدید خو گرفتن به آنچه در این در اینجا بیانگر گزینه ای است که پاسخ دادن به - ستاره به نمایندگی از یک اشاره گر است که فقط آنچه در شرایط خارج از حرفه یا فن خاصی است؟ پس از آن آدرس است. پس از آن آدرس چیزی در حافظه است. و ما به پوست پشت لایه های آغاز شده چند هفته پیش، همه چیز دوست دارم چنین توابع GetString و سایر تمام این مدت در حال بازگشت شده است آدرس چیزهایی در حافظه، مانند آدرس اولین کاراکتر در برخی از دنباله. بنابراین ما نیز به معرفی valgrind، که شما شروع به استفاده از آن برای این مشکل تعیین می کنند، به ویژه برای آینده مشکل تنظیم نیز هست. و valgrind می کند آنچه که برای ما؟ برای نشت حافظه چک، و آن را همچنین برای سوء استفاده از حافظه چک. این می تواند با برخی از احتمال، تشخیص اگر کد خود را در حال رفتن به لمس حافظه که آن را به سادگی نباید. بنابراین لزوما نمی کند، نشت آب، اما اگر شما فراتر از مرزهای برخی آرایه، و شما در واقع اجرا valgrind و القا کنند که رفتار در حالی که valgrind در حال اجرا است در برنامه شما است در حال اجرا در داخل از آن، خواهید پیام های شبیه به این - "نامعتبر ارسال اندازه 4 "، که، به یاد یک زن و شوهر هفته پیش بدان معنی است که من تا به حال به طور تصادفی می خواهم در یک بین المللی بیش از حد فراتر از مرزهای یک آرایه. و به همین ترتیب اندازه 4 به معنای اندازه از آن نوع int خاص. بنابراین اطمینان در این واقعیت را که خروجی valgrind در قالب آن، فقط بی رحم است. این واقعا سخت است از طریق ظروف سرباز یا مسافر اطلاعات جالب. بنابراین آنچه ما در اینجا انجام داده ام فقط گزیده ای است برخی از زن و شوهر بیشتر خطوط جالب است. اما متوجه باشید که 80٪ از valgrind را خروجی است برای رفتن به یک بیت از یک حواس پرتی. فقط الگوهای هایی از این دست نگاه کنید - نامعتبر راست، نامعتبر خواندن، 40 بایت و برخی از تعدادی از بلوک قطعا از دست داده، کلمات کلیدی مانند که. و آنچه شما امیدوارم خواهید دید این است برخی از نوع اثری از آنچه عمل اشتباه است که در واقع شوید. در این مورد در اینجا، در چه خط کد من خطا بود؟ 26 در یک فایل به نام memory.c، بود که مثال ما با بازی در آن زمان است. پس از آن احتمالا در malloc نیست. احتمالا در کد من به جای. بنابراین ما این را دوباره ببینم و دوباره قبل از اینکه طولانی است. بنابراین scanf، این در آمد زن و شوهر از اشکال تا کنون. ما شاهد sscanf به طور خلاصه. این چیزی است که تعدادی از بود شما را به خود را در شیرجه آماده سازی برای مسابقه. و scanf است که در واقع چیزی است که CS50 کتابخانه شده است با استفاده از زیر هود برای مدتی به منظور برای دریافت ورودی از کاربر است. برای مثال، اگر من بیش از حرکت به CS50 لوازم خانگی در اینجا، به من اجازه باز کردن به عنوان مثال امروز که به نام scanf 0.c و آن را فوق العاده ساده است. این فقط چند خط کد. اما آن را نشان می دهد واقعا چگونه getInt از کار کرده است همه از این زمان. در این برنامه در اینجا، در خط 16 ، توجه کنید که من بین المللی اعلام. بنابراین هیچ اشاره گرها، هیچ چیز جادویی ، فقط یک بین المللی وجود دارد. سپس در خط 17، من بی درنگ کاربر یک عدد، لطفا. سپس در اواخر سال 18، من از scanf استفاده کنید. و من مشخص شده، نوع مانند چون printf، که من انتظار اعلان نقل قول را تمام کردن درصد. بنابراین درصد من، البته، بیانگر گزینه ای است که پاسخ دادن به یک int است. اما متوجه چه دوم استدلال به scanf است. چگونه می توانید دوم توصیف بحث بعد از کاما از هم؟ چیست؟ این آدرس از x است. بنابراین این بسیار مفید است زیرا با ارائه scanf با آدرس x را، چه که قدرت آن تابع به انجام؟ نه تنها وجود دارد، بلکه انجام چه؟ ایجاد یک تغییر به آن. از آنجا که شما وجود دارد می تواند به آن مرتب سازی بر اساس مانند یک نقشه را به یک مکان در حافظه. و تا زمانی که به شما ارائه scanf، یا هر تابع با چنین نقشه، که تابع می تواند وجود داشته، و نه تنها نگاهی به ارزش، اما همچنین می تواند تغییر که ارزش، که اگر مفید هدف در زندگی از scanf اسکن ورودی از کاربر، به طور خاص از صفحه کلید. و F بیانگر گزینه ای است که پاسخ دادن به فرمت شده، درست مثل چون printf، F بیانگر گزینه ای است که پاسخ دادن به یک فرمت رشته ای که می خواهید برای چاپ. بنابراین در کوتاه مدت، این خط 18 به سادگی می گوید، سعی کنید به خواندن int از کاربر صفحه کلید و ذخیره آن در داخل از x، در هر آدرس X اتفاق می افتد به زندگی می کنند. و سپس در آخر، خط 19 می گوید، با تشکر برای بین المللی، در این مورد. پس اجازه دهید من جلو بروید و این. بنابراین به scanf 0. بگذار بروم جلو و بزرگنمایی شوید. من هم خواهم رفت و اجرای این کار را با نقطه اسلش scanf 0. شماره، لطفا؟ 50. با تشکر برای 50. پس از آن بسیار ساده است. در حال حاضر آنچه آن را انجام نمی دهد؟ آن را انجام نمی دهد یک دسته کامل چک کردن خطا. به عنوان مثال، اگر من همکاری نمی کنند، و من در یک عدد تایپ کنید، اما به جای من چیزی مانند "سلام،" ارسال که فقط نوع عجیب و غریب. و به این ترتیب یکی از چیزهایی که CS50 کتابخانه شده است برای ما انجام می دهند برای برخی از زمان که reprompting است و reprompting. در فراخوان سعی مجدد عبارت را در cs50.c را، و که دلیل که getInt در کتابخانه CS50 است که در واقع یک کل دسته از صف های طولانی، زیرا ما برای چک کردن چیزهای احمقانه مثل این. آیا کاربر نمی دهد ما، در واقع، یک int؟ آیا او و یا او به ما چیزی بدهد مثل یک نامه بر اساس حروف الفبا مرتب؟ اگر چنین است، ما می خواهم به تشخیص که و به آنها داد. اما همه چیز جالب تر در این مثال بعدی. اگر من به scanf 1.c به به، چه کس چیزی است که اساسا در تغییر این مثال بعدی؟ من با استفاده از کاراکتر *، البته، به جای آن از نوع int است. بنابراین این جالب است، زیرا کاراکتر *، یاد است، واقعا تنها همان چیزی که به عنوان رشته. بنابراین آن را احساس می کند مانند شاید این فوق العاده است پیاده سازی ساده از GetString. اما من پوست کنده ام پشت لایه کتابخانه CS50، بنابراین من خواستار این کاراکتر * در حال حاضر. بنابراین اجازه دهید را ببینید که در آن، اگر در هر نقطه، ما به اشتباه است. خط 17 - من دوباره می گویند، لطفا به من چیزی بدهد، در این مورد، یک رشته است. و سپس در خط بعدی، من اسمش scanf، دوباره، به آن یک کد فرمت، اما این بار درصد است. و پس از این زمان، من هستم دادن آن بافر شده است. حالا متوجه، من با استفاده از آن & را داشتند. اما به همین دلیل است که احتمالا OK در اینجا؟ از آنجا که آنچه بافر در حال حاضر؟ در حال حاضر یک اشاره گر است. در حال حاضر یک آدرس. و اجازه دهید این کلمه "اشتباه" اجازه دهید من فقط آن تماس بگیرید، برای مثال، برای سادگی. اما من به نام ام آن را بافر چرا که در به طور کلی، در برنامه نویسی، اگر شما یک تکه از حافظه، که واقعا یک رشته فقط می شود، شما ممکن است آن را به یک بافر تماس بگیرید. این یک محل برای ذخیره اطلاعات است. مشابه به چیزهایی مانند یوتیوب، هنگامی که آنها buffering می شناسد، پس به صحبت می کنند، که فقط به معنی آن دانلود بیت از اینترنت و ذخیره سازی آنها را در یک آرایه های محلی، یک تکه محلی از حافظه که شما می توانید آن را بعدا بدون تماشای پرش و یا حلق آویز در شما در حالی که بازی. بنابراین یک مشکل وجود دارد در اینجا هر چند، چون من گفتن scanf، انتظار می رود رشته از کاربر. در اینجا آدرس یک تکه از حافظه است. قرار دهد که به رشته وجود دارد. به همین دلیل است که محدود ما مشکل، هر چند؟ چه خبر؟ هستم به من اجازه برای دسترسی به که بخشی از حافظه؟ شما می دانید، من نمی دانم. از آنجا بافر مقداردهی اولیه شده است به هر چیزی؟ نه واقعا. و پس از آن چیزی است که ما خواستار شده ام یک مقدار زباله، که یک کلمه رسمی نیست. این فقط به این معنی است که ما هیچ ایده چه چیزی بیت داخل چهار بایت که من به عنوان بافر اختصاص داده شده است. من malloc به نام نیست. من قطعا GetString نامیده می شود نیست. بنابراین چه کسی می داند آنچه است که در واقع در داخل بافر؟ و در عین حال گفتن scanf کورکورانه، به آنجا قرار داده و هر کاربر تایپ. پس چه شده است به احتمال زیاد باعث در کد ما اگر ما آن را اجرا کنید؟ احتمالا segfault. شاید نه، اما احتمالا segfault. و من می گویم شاید نه به خاطر اینکه گاهی اوقات شما انجام دهید، گاهی اوقات شما نمی segfault است. گاهی اوقات شما فقط خوش شانس، اما با این حال برای رفتن به یک اشکال در برنامه های ما است. پس اجازه دهید من جلو بروید و تدوین این. من قصد دارم به آن راه مدرسه قدیمی انجام دهید. و بنابراین صدای جرنگ جرنگ غذایی DASH 0، scanf-1، scanf 1.c، وارد کنید. متأسفیم، مدرسه خیلی قدیمی است. اجازه دهید را ببینید. کجا بروم؟ آه، * بافر کاراکتر. اوه، با تشکر از شما - جویی در هزینه، OK - مدرسه بسیار قدیمی است. همه حق است، آن را مدتی بوده است. بنابراین من فقط فایل بعد از ذخیره ساخت که موقت برای تغییر یک لحظه پیش. و در حال حاضر من آن را وارد دستی و با صدای جرنگ جرنگ. و در حال حاضر من قصد دارم به جلو بروید و اجرا scanf-1 را وارد کنید. رشته لطفا. من در تایپ "سلام." و در حال حاضر، در اینجا است که در آن، رک و پوست کنده، چون printf می تواند کمی آزار دهنده است. در واقع رفتن به در این مورد segfault. چون printf است که کمی خاص است، زیرا آن را بسیار فوق العاده که معمولا استفاده می شود که اساسا چون printf در حال انجام ما به نفع و تحقق، که یک اشاره گر معتبر نیست. اجازه بدهید من آن را بر خودم را فقط چاپ در پرانتز تهی، حتی هر چند که نه لزوما آنچه که ما خودمان را انتظار می رود. بنابراین ما واقعا به راحتی نمی تواند وادار segfault با این کار، اما به وضوح این رفتار من می خواستم نیست. پس چه راه حل ساده است؟ خوب، در scanf 2، اجازه دهید به من پیشنهاد که به جای در واقع فقط اختصاص * کاراکتر، اجازه دهید من کمی در مورد دقیق این، و به من اجازه تخصیص بافر به عنوان دنباله ای از 16 کاراکتر است. بنابراین من می توانم این کار را در یک زن و شوهر از راه انجام دهد. من کاملا می تواند استفاده از malloc. اما من می توانم به دو هفته به زمانی که من فقط نیاز به یک دسته کامل از حرف می باشد. که فقط یک آرایه است. پس اجازه دهید من به جای دوباره تعریف بافر به مجموعه ای از 16 کاراکتر. و در حال حاضر، وقتی که من عبور بافر در - و این چیزی است که ما انجام دادیم صحبت در مورد در هفته دو - اما شما می توانید یک آرایه به عنوان درمان هر چند آن آدرس است. با مشخصات فنی، به عنوان دیده ایم، آنها کمی متفاوت است. اما scanf نمی خواهد ذهن اگر از آن بگذرند نام یک آرایه، زیرا چه صدای جرنگ جرنگ را انجام خواهد داد برای ما است که اساسا نام این آرایه را به عنوان درمان آدرس تکه 16 کلمه در ادامه متن. بنابراین این بهتر است. این به این معنی در حال حاضر که من امیدوارم زیر را انجام دهید. اجازه بدهید من زوم کردن برای یک لحظه و انجام scanf-2، وارد OK. حالا اجازه دهید من رو بریده بریده scanf-2. رشته لطفا. "سلام." و آن را به نظر می رسید به کار این زمان. اما می توانید به کسی پیشنهاد یک سناریو که در آن ممکن است هنوز کار نمی کند؟ آره؟ چیزی بیشتر از 16 کاراکتر باشد. و در واقع، ما می تواند کمی دقیق تر است. چیزی دیگر 15 کاراکتر، چون واقعا ما باید به خاطر داشته باشید که ما نیاز داریم که بک اسلش صفر به طور ضمنی در پایان رشته، است که کنار scanf به طور معمول خواهد شد مراقبت از برای ما. پس به من اجازه انجام چیزی شبیه به - گاهی اوقات ما فقط می تواند ترک آن را مانند آن. خوب، پس ما در حال حاضر ناشی از ام گسل تقسیم بندی ما است. چرا؟ از آنجا که من به بیش از 15 تایپ شخصیت ها، و بنابراین ما در واقع حافظه لمس که من در واقع باید داشته باشد. پس چه چیزی واقعا راه حل در اینجا؟ خوب، اگر ما نیاز به یک رشته طولانی تر است؟ خب، ما شاید آن 32 بایت است. خب، چه می شود اگر که به اندازه کافی بلند نیست؟ چگونه در حدود 64 بایت؟ اگر چه که به اندازه کافی بلند نیست؟ چگونه در حدود 128 یا 200 بایت؟ واقعا چه راه حل در اینجا در در حالت کلی، اگر ما در را نمی دانم پیشبرد آنچه را که کاربر را برای رفتن به تایپ؟ این فقط نوع درد بزرگ در الاغ، صادقانه بگویم، همین دلیل است که CS50 کتابخانه دارای چند ده خط کد که اجرای جمعی از GetString رشته در راهی که ما نمی باید بدانید که در چه کاربر رفتن به تایپ. به طور خاص، اگر شما نگاه از پشت در cs50.c از دو هفته پیش، خواهید دید که GetString در واقع می کند scanf در این راه استفاده نمی کنند. در عوض، آن را می خواند یکی از شخصیت ها در یک زمان. از آنجا که یک چیز خوب در مورد خواندن یکی از شخصیت ما می توانیم تضمین خودمان را به همیشه حداقل یک کاراکتر. من فقط می تواند اعلام یک کاراکتر، و پس از آن این مراحل واقعا کودک به تنها خواندن یکی از شخصیت ها در زمان از صفحه کلید. و پس از آن، شما GetString می کند در هر زمان آن را اجرا می کند از است، می گویند، 16 بایت از حافظه، از آن استفاده می کند malloc، یا یک پسر عموی آن، به تخصیص حافظه بیشتر، کپی قدیمی حافظه به جدید، و سپس خزنده همراه، گرفتن یکی از شخصیت ها در یک زمان، و زمانی که آن را اجرا می کند از آن تکه حافظه، آن را می اندازد دور، منازعه یک تکه بزرگتر از حافظه، کپی به جدید، و تکرار. و این واقعا درد در واقع پیاده سازی چیزی به عنوان ساده به عنوان گرفتن ورودی از کاربر است. بنابراین شما می توانید scanf استفاده کنید. شما می توانید توابع مشابه استفاده کنید. و بسیاری از کتابهای درسی و آنلاین نمونه انجام دهید، اما همه آنها هستید آسیب پذیر به مشکلات شبیه به این. و در نهایت، گرفتن segfault نوع آزار دهنده است. این خوب است برای کاربر نیست. اما در بدترین حالت، چه آن را اساسا با قرار دادن خود کد را در معرض خطر؟ نوعی از حمله، به طور بالقوه. ما در مورد یکی از این حمله صحبت کردیم - سرریز پشته. اما به طور کلی، اگر شما مجاز به سرریز بافر، مانند ما یک چند هفته پیش، تنها با نوشتن بیش از "سلام" را بر روی پشته، شما در واقع می تواند به سر می برد، به طور بالقوه، کامپیوتر، و یا حداقل در داده که به تو تعلق ندارد. بنابراین در کوتاه مدت، این است که چرا ما باید کسانی که چرخ آموزشی. اما در حال حاضر، ما شروع به آنها را خاموش، به عنوان برنامه های ما دیگر نیازی، لزوما، ورودی از کاربر است. اما در مورد مشکل به مجموعه شش، ورودی خود را از یک بزرگ فایل دیکشنری با 150 برخی از عجیب و غریب هزار کلمه. بنابراین شما نمی خواهد که به نگرانی در مورد ورودی دلخواه کاربر. ما شما را به برخی از فرضیات را در مورد آن فایل. هر گونه سوال در مورد اشاره گرها یا scanf و یا ورودی کاربر را به طور کلی؟ همه حق است، بنابراین یک نگاه سریع و سپس در یک موضوع فرار از دو هفته پیش. و این که این مفهوم یک ساختار بود. نه این که - این مفهوم ساختار، که چه بود؟ چه ساختار برای ما انجام می دهید؟ تعریف - ببخشید؟ تعریف یک نوع متغیر. پس از مرتب کردن بر اساس. ما در واقع ترکیب دو موضوع است. بنابراین با typedef، به یاد آورید که ما می توانیم اعلام یک نوع از خود ما، مانند مترادف، مانند رشته کاراکتر *. اما با استفاده از typedef و ساختار، ما می توانیم واقعا ایجاد ساختارهای داده ای خود ما. برای مثال، اگر من برگردم به نرمافزاری gedit در اینجا برای فقط یک لحظه، و من به جلو و چیزی شبیه به، به من اجازه صرفه جویی این را به عنوان، اجازه دهید بگویم، structs.c به طور موقت، من فقط رفتن به جلو بروید و شامل standardio.h، درجه اعتبار ساقط اصلی int است. و سپس در اینجا، فرض کنید که من می خواهم برای نوشتن یک برنامه است که فروشگاه ها دانش آموزان مختلف از چند خانه ها، به عنوان مثال. بنابراین مانند یک registrarial است پایگاه داده به نوعی. بنابراین اگر من نیاز به نام یک دانش آموز، من ممکن است چیزی شبیه به نام * کاراکتر انجام دهید، و من چیزی را انجام دهید مانند - در واقع، اجازه استفاده از کتابخانه CS50 برای فقط یک لحظه را به این کمی ساده تر است، بنابراین ما می توانیم قرض کسانی که ده ها تن از خطوط کد. و اجازه دهید فقط آن را ساده نگه دارید. ما آن را رشته را نگه دارید، و در حال حاضر GetString. بنابراین من ادعا می کنند در حال حاضر که من این نام را ذخیره کرده اید برخی از دانش آموزان، و خانه برخی از دانش آموزان، به سادگی با استفاده از متغیرهای مثل ما انجام دادیم و در هفته اول. اما فرض کنید من در حال حاضر می خواهم برای حمایت از دانش آموزان متعدد. همه حق است، بنابراین غرایز من به انجام رشته NAME2، GetString می شود، رشته house2 GetString می شود. و پس از آن دانش آموز سوم ما، اجازه دهید انجام NAME3 GetString. همه حق است، پس این است که امیدوارم قابل توجه شما به عنوان نوع احمقانه، زیرا این فرآیند واقعا هرگز رفتن به انتها، و آن را فقط به به کد من نگاه بدتر و بدتر و بدتر است. اما ما بیش از حد در دو هفته حل کرد. راه حل نسبتا تمیز ما چه بود هنگامی که ما تا به حال چندین متغیر از همان نوع داده که به همه مربوط است، اما ما از این آشفته بازار بی رحم می خواهم از متغیرهایی با همین نام؟ چیزی که ما به جای کار را کرد؟ بنابراین من فکر می کنم من شنیده ام چند مکان. ما یک آرایه بود. اگر می خواهید موارد متعددی از چیزی، چرا ما نمی توانیم این همه تمیز کردن و فقط می گویند، به من بده نام آرایه نامیده می شود؟ و در حال حاضر، اجازه دهید سخت کد 3. و سپس به من آرایه دیگری به من بدهید به نام خانه ها، و اجازه بدهید من برای شرکت کد سخت 3. و من انبوه تمیز کردن ظروف سرباز یا مسافر است که من فقط ایجاد. در حال حاضر، من هنوز هم سخت کدگذاری 3، اما حتی 3 به صورت پویا می توانند از کاربر، و argv، و یا مانند. پس این است که در حال حاضر پاک کننده است. اما آنچه آزار دهنده در مورد این است که در حال حاضر، حتی اگر یک نام است به نحوی اساسا مرتبط خانه دانش آموز - یک دانش آموز که من واقعا می خواهم برای نشان دادن - من در حال حاضر دو آرایه که موازی هستند به این معنا که آنها به همان اندازه، و نام براکت 0 احتمالا نقشه ها به براکت خانه 0، و نام براکت 1 نقشه به خانه براکت 1. به عبارت دیگر، زندگی که دانش آموز در آن خانه، و آن دانش آموز دیگر زندگی در آن خانه دیگر. اما مطمئنا این می تواند حتی پاک تر انجام می شود. خوب، می تواند، در واقع. و اجازه دهید من به جلو و باز تا structs.h، و شما این ایده اینجا را ببینید. توجه داشته باشید که من typedef استفاده می شود، همانطور که شما اشاره به یک لحظه پیش به اعلام ما نوع داده های خود. اما من هم با استفاده از این کلمه کلیدی دیگر به نام ساختار است که به من می دهد جدید ساختار داده ها. و این ساختار داده ها ادعا می کنند من در حال رفتن به دو چیز داخل - یک رشته به نام نام، و یک رشته به نام خانه. و نام من قصد دارم را به این ساختار داده ها در حال رفتن به نام دانشجو. من می توانم آن را هر چیزی که من می خواهم تماس بگیرید، اما این معنایی حس به من در ذهن من است. بنابراین در حال حاضر، اگر من باز کردن یک نسخه بهتر در این برنامه من شروع به نوشتن وجود دارد، اجازه دهید به من بالا رفته. و در برخی از خطوط بیشتر از کد وجود دارد در اینجا، اما به من اجازه تمرکز لحظه ای در یک. من به نام دانش آموزان ثابت را اعلام کرده ام و سخت در حال حاضر کدگذاری 3. اما در حال حاضر، توجه داشته باشید که چگونه تمیز کد من شروع به دریافت کنید. در خط 22، من اعلام مجموعه ای از دانش آموزان. و توجه کنید که دانش آموز ظاهرا در حال حاضر یک نوع داده است. از آنجا که در بالای این فایل، توجه من را گنجانده ام که فایل هدر که من کشیده تا همین چند لحظه پیش. که فایل هدر و کاملا به سادگی این تعریف از یک دانش آموز است. بنابراین در حال حاضر، من اطلاعات سفارشی خود را ایجاد کرده اید نوع که نویسندگان سال C پیش از در پیش فکر نمی کنم. اما هیچ مشکلی. من می توانم آن را به خودم را. بنابراین این یک آرایه به نام دانش آموزان است، هر یک از اعضای که ساختار دانش آموز. و من می خواهم سه نفر از کسانی که در آرایه. و در حال حاضر، چه بقیه از این برنامه انجام دهید؟ من چیزی کمی خودسرانه مورد نیاز. پس از 24 به بعد آنلاین، من از 0 تا 3 تکرار. من پس از آن کاربر برای درخواست نام دانش آموز. و سپس من با استفاده از GetString مانند قبل. سپس من به خانه دانش آموز بخواهید، و من از GetString به عنوان قبل از استفاده. اما توجه کنید - کمی جدید قطعه ای از نحو - من می توانم هنوز هم شاخص به دانش آموز i ام، اما چگونه می توانم در داده های خاص داخل زمینه ساختار؟ خب، چه ظاهرا قطعه جدید از نحو؟ آن فقط عملگر نقطه. ما واقعا قبل از این دیده نشده است. شما آن را در pset پنج دیده می شود اگر شما شیرجه در حال حاضر با فایل های بیت مپ. اما نقطه فقط در داخل این به معنی ساختار و زمینه های مختلف، به نقطه نام، و یا به من نقطه خانه بدهد. این بدان معناست که به داخل ساختار و کسانی که زمینه های خاص. بقیه از این برنامه چه کاری انجام دهید؟ این همه که سکسی نیست. توجه داشته باشید که من از 0 تا 3 تکرار دوباره، و من به سادگی ایجاد انگلیسی عبارت چنین و چنان است در چنین و مانند یک خانه، عبور در نام نقطه از دانش آموز i ام و خانه و همچنین. و پس از آن در نهایت، در حال حاضر ما می خواهیم شروع به گرفتن مقعد در این مورد در حال حاضر که ما با چه malloc و آشنا توابع دیگر بوده است انجام تمام این مدت. چرا من برای آزاد کردن هر دو نام و خانه، حتی اگر من malloc تماس بگیرید نکرد؟ GetString انجام داد. و این راز کوچک کثیف بود چند هفته، اما GetString نشت حافظه در سراسر تمام ترم را تا کنون. و valgrand در نهایت خواهد شد نشان می دهد این به ما. اما این یک معامله بزرگ نیست، زیرا من می دانم که من به سادگی می توانید نام رایگان و خانه، هر چند از لحاظ فنی، فوق العاده، فوق العاده امن، من باید انجام برخی از خطا را بررسی کنید. غرایز خود را گفتن در شما می شوند؟ باید چه کار کنم برای چک کردن قبل از من آزاد است رشته، با نام مستعار که کاراکتر *؟ من واقعا باید بررسی شود اگر دانش آموزان براکت من نقطه نام و نام ندارد تهی برابر است. سپس آن را خوب به جلو بروید و آزاد که اشاره گر، و یا همان به عنوان یکی است. اگر دانش آموزان براکت من خانه نقطه نیست برابر با تهی، این در حال حاضر محافظت خواهد کرد در مقابل در مورد گوشه که در آن GetString چیزی شبیه به تهی باز می گردد. و ما را دیدم یک لحظه پیش، چون printf محافظت از ما تا اینجا فقط گفت: تهی، که در حال رفتن به نگاه عجیب و غریب. اما حداقل آن را نمی خواهد segfault، همانطور که ما را دیده اند. خوب، اجازه دهید من می توانم یک چیز دیگر در اینجا. ساختمانها-0 نوع از یک برنامه احمقانه است چون من وارد تمام این اطلاعات، و سپس آن را از دست داده پس از آن که برنامه به پایان می رسد. اما اجازه دهید من جلو بروید و این کار را انجام. اجازه دهید ترمینال پنجره کمی بزرگتر. اجازه دهید مرا ساختمانها-1، که یک نسخه جدید از این است. من در کمی زوم. و در حال حاضر اجازه دهید من به نقطه اجرا بریده بریده ساختمانها-1. نام دانش آموز - دیوید ماتر، بیایید راب Kirkland به، اجازه انجام لورن Leverett. چه جالب توجه است - و من فقط این به این دلیل می دانم من نوشت: این برنامه - یک فایل وجود دارد در حال حاضر در حال حاضر من در دایرکتوری بنام students.csv. برخی از شما ممکن است را دیده اند، این در دنیای واقعی. یک فایل CSV چه؟ با کاما جدا کنید. مرتب سازی بر اساس مثل یک مرد فقیر نسخه از یک فایل اکسل. این جدول از سطر و ستون است که شما می توانید در یک برنامه مثل اکسل باز، یا تعداد در مک. و اگر من این فایل بر روی نرمافزاری gedit باز در اینجا، توجه - و اعداد وجود ندارد. که فقط نرمافزاری gedit گفتن شماره خط من. توجه کنید در خط اول از این فایل دیوید و مادر است. خط بعدی راب کاما Kirkland هنر است. و خط سوم لورن است کاما Leverett. بنابراین من ایجاد کرده است؟ من در حال حاضر یک برنامه C نوشته شده است که به طور موثر می تواند گسترده تولید که می تواند در باز برنامه ها مانند اکسل. که قانع کننده مجموعه داده، اما اگر شما تکه های بسیار بزرگتر از داده است که شما در واقع می خواهم دستکاری و ایجاد نمودار و می خواهم، این است که شاید یکی راه ایجاد می کند که داده ها. علاوه بر این، CSV ها در واقع فوق العاده مشترک فقط برای ذخیره سازی داده های ساده - یاهو امور مالی، به عنوان مثال، اگر شما قیمت سهام از طریق به اصطلاح خود API، سرویس رایگان است که به شما اجازه می دهد تا در حال حاضر سهام تا به روز نقل قول برای شرکت ها، آنها را داده پشت در فوق العاده فرمت CSV ساده به. بنابراین، چگونه ما را انجام داد؟ خوب توجه کنید، بسیاری از این برنامه تقریبا مشابه دارد. اما متوجه کردن در اینجا، به جای چاپ دانش آموزان، در خط 35 بعد، من ادعا می کنند که من صرفه جویی در دانش آموزان بر روی دیسک، بنابراین صرفه جویی در یک فایل. بنابراین متوجه من اعلام FILE * - در حال حاضر، این نوع ناهنجاری در C است به هر دلیلی، فایل همه کلاه است، است که مانند بسیاری از انواع داده های دیگر نیست در C. اما این ساخته شده است در نوع داده ها، فایل *. و من اعلام یک اشاره گر به یک فایل، این است که چگونه شما می توانید از فکر می کنم. fopen یعنی باز کردن فایل. چه فایل های شما می خواهید برای باز کردن؟ من می خواهم برای باز کردن یک فایل که من خواهد شد خودسرانه students.csv تماس بگیرید. من می توانم که هر چیزی که می خواهید تماس بگیرید. و سپس یک حدس است. چه آرگومان دوم به fopen احتمالا معنی؟ راست، w برای نوشتن، می تواند R به عنوان خوانده شده. برای الحاق وجود دارد اگر شما می خواهم برای اضافه کردن سطر و نه بازنویسی همه چیز. اما من فقط می خواهم برای ایجاد این فایل یک بار، به طوری که من نقل قول نقل قول را تمام کردن عرض استفاده کنید. و من می دانم که تنها از از خواندن اسناد و مدارک، و یا صفحه مرد. اگر فایل تهی نیست - به عبارت دیگر، اگر هیچ مشکلی وجود ندارد رفت - اجازه دهید من بیش از تکرار دانش آموزان از 0 تا 3. و در حال حاضر متوجه چیزی وجود دارد همیشه تا کمی متفاوت در مورد خط 41. آن را چون printf نیست. این به fprintf برای فایل چون printf است. پس از آن رفتن به نوشتن در فایل. کدام فایل؟ یکی که اشاره گر مشخص می کنید به عنوان آرگومان اول. سپس یک رشته فرمت را مشخص کنید. سپس ما مشخص چه رشته ما می خواهیم پلاگین برای اولین درصد بازدید کنندگان، و سپس یکی دیگر از متغیر یا درصد S دوم است. سپس فایل را با fclose ما نزدیک است. از من آزاد کردن حافظه مانند قبل، هر چند من باید پشت در بروید و اضافه کردن برخی از چک تهی. و آن. fopen، fprintf، fclose به من می دهد توانایی ایجاد فایل های متنی. در حال حاضر، شما در مشکل مجموعه پنج، که شامل تصاویر، شما خواهید بود با استفاده از فایل های باینری به جای. اما اساسا، این ایده همان است، حتی اگر توابع شما دیدن کمی متفاوت است. بنابراین تور گردباد، اما شما بدست می آورید بیش از حد آشنا با فایل I/O-- ورودی و خروجی - با pset پنج. و هر گونه سوال در مورد اصول اولیه در اینجا؟ آره؟ چه می شود اگر شما سعی می کنید برای آزاد کردن یک مقدار تهی؟ به اعتقاد من، مگر اینکه رایگان است بدست کمی بیشتر کاربر پسند، شما می توانید به طور بالقوه segfault. پس از گذشت آن تهی بد است چون من نمی باور اذیت برای شما چک کنید، زیرا به طور بالقوه خواهد بود زباله زمان آن را به خود کار را برای هر کس در جهان است. سوال خوبی است، هر چند. همه حق است، بنابراین این نوع می شود ما را به یک موضوع جالب. موضوع مجموعه مشکل پنج پزشکی قانونی است. حداقل که بخش از مجموعه مشکل است. پزشکی قانونی به طور کلی به اشاره دارد بازیابی اطلاعات که ممکن است یا ممکن است حذف نشده است عمدا. و بنابراین من فکر کردم من می خواهم به شما سریع طعم از آنچه که واقعا در رفتن در تمام این زمان در زیر هود از کامپیوتر شما. به عنوان مثال، اگر شما در داخل خود را لپ تاپ و یا کامپیوتر رومیزی خود را هارد دیسک، یا مکانیکی دستگاهی است که در واقع می چرخد ​​- چیزهای مدور به نام پلاتر وجود دارد که نگاه کاملا شبیه آنچه که من فقط بر روی صفحه نمایش در اینجا، هر چند این مدرسه به طور فزاینده ای قدیمی است. این سه و نیم اینچ است هارد دیسک. و سه و نیم اینچ اشاره با چیزی که زمانی که شما آن را نصب کنید در کامپیوتر است. بسیاری از شما بچه ها در لپ تاپ های خود را در حال حاضر درایوهای حالت جامد، یا SSD، که هیچ حرکت بخش است. آنها بیشتر شبیه به RAM و کمتر شبیه هستیم این دستگاه مکانیکی است. اما این ایده هنوز هم یکسان هستند، قطعا به عنوان آنها مربوط به مشکل مجموعه پنج. و اگر شما فکر می کنم در مورد هارد دیسک نشان دهنده یک دایره است، که من مثل این اینجا را جلب کند. هنگامی که یک فایل بر روی کامپیوتر شما را ایجاد می کنید، آن است که آیا SSD، و یا در این مورد، درایو مدرسه قدیمی سخت، این فایل شامل چندین بیت است. بیایید می گویند که آن را این 0 و 1، یک دسته کامل از 0s و 1S و. بنابراین این کل دیسک سخت من است. این ظاهرا یک فایل بسیار بزرگ است. و آن را با استفاده از 0s و 1S و در آن بخش از صفحه گرامافون فیزیکی. خوب، آنچه که بخش فیزیکی است؟ خب، معلوم است که بر روی دیسک سخت، حداقل از این نوع وجود دارد، این ذرات مغناطیسی کوچک کوچک. و آنها اساسا شمال و قطب جنوب به آنها، به طوری که اگر شما به نوبه خود یکی از کسانی که ذرات مغناطیسی به این ترتیب، شما ممکن است بگویید که آن را به نمایندگی از 1. و اگر آن را وارونه جنوب به در شمال، شما ممکن است می گویند که آن به نمایندگی از 0. بنابراین در دنیای فیزیکی واقعی، که چگونه شما می توانید چیزی در نمایندگی حالت باینری 0 و 1. به طوری که تمام یک فایل است. یک دسته کامل از مغناطیسی وجود دارد ذراتی که در این راه یا به این ترتیب، ایجاد الگوهای از 0s و و 1S. اما معلوم است هنگامی که شما یک فایل را ذخیره کنید، برخی از اطلاعات به صورت جداگانه ذخیره شده است. بنابراین این یک میز کوچک است، یک دایرکتوری، پس به صحبت می کنند. و من این نام ستون تماس بگیرید، و من این مکان ستون خواهید تماس بگیرید. و من قصد دارم برای گفتن، فرض کنید این رزومه کاری من است. resume.doc من این است که در ذخیره می شود محل، اجازه دهید بگویم 123. من همیشه برای این تعداد بروید. اما کافی است به می گویند که درست مثل در رم، شما می توانید یک هارد دیسک را که یک گیگابایت یا 200 گیگابایت یا ترابایت، و شما می توانید تعداد کلمه در ادامه متن. شما می توانید تمام تکه از 8 بیت عدد است. بنابراین ما می خواهیم که این را می گویم 123 محل است. بنابراین این دایرکتوری در داخل عامل من سیستم به یاد می آورد که من رزومه کاری در محل 123. اما جالب می شود که شما یک فایل را حذف کنید. بنابراین به عنوان مثال - و خوشبختانه، اکثر نقاط جهان بر روی این گرفتار - چه زمانی اتفاق می افتد شما کشیدن یک فایل به سطل زباله خود را در سیستم عامل مک یا سطل بازیافت ویندوز خود را؟ هدف از انجام این کار چیست؟ بدیهی است برای خلاص شدن از شر فایل، اما چه عمل کشیدن و حذف به سطل زباله خود را و یا خود را سطل آشغال بر روی یک کامپیوتر انجام دهید؟ مطلقا هیچ چیز، واقعا. درست مثل یک پوشه است. این یک پوشه خاص است، تا مطمئن شوید. اما آیا آن را در واقع فایل را حذف کنید؟ خب، نه، چرا که برخی از شما احتمالا مانند شده است، آه لعنتی، این کار را نکرده معنی به انجام این کار. بنابراین شما دوبار کلیک کنید سطل زباله یا سطل آشغال. تو در اطراف poked و بهبود اید فایل را تنها با کشیدن آن از آنجا. بنابراین به وضوح، آن لزوما حذف آن. خوب، شما دقیق تر از آن هستیم. شما می دانید که فقط آن را کشیدن به سطل زباله یا سطل بازیافت به این معنا نیست شما در حال تخلیه سطل زباله. بنابراین شما به منو بروید، و به شما می گویند سطل زباله خالی است و یا خالی سطل بازیافت. پس چه اتفاقی می افتد؟ آره، پس از آن حذف شده است بیشتر از آن. اما همه که اتفاق می افتد این است. کامپیوتر فراموش که در آن resume.doc بود. اما آنچه که ظاهرا تغییر نکرده است در تصویر؟ بیت، و 0s و 1S که من ادعا می کنند در سایت برخی از جنبه های فیزیکی سخت افزار. آنها هنوز هم وجود دارد. این فقط کامپیوتر فراموش شده چه هستند. پس از آن اساسا آزاد فایل بیت به طوری که آنها را می توان مورد استفاده مجدد قرار. اما نه تا زمانی که شما ایجاد فایل های بیشتر، و فایل های فایل های بیشتر و بیشتر خواهد شد احتمالاتی، و کسانی که 0s و 1S، این ذرات مغناطیسی، مورد استفاده مجدد قرار، صعودی یا راست به سمت بالا، برای فایل های دیگر، و 0s و 1S. بنابراین شما باید این پنجره زمان. و آن را قابل پیش بینی نیست طول، واقعا. آن را در اندازه سخت شما بستگی دارد درایو و چگونه بسیاری از فایل های شما و چگونه به سرعت شما را به آنهایی که جدید. اما این پنجره زمان وجود دارد در طول که آن فایل است که هنوز هم کاملا بازیابی. بنابراین اگر شما همیشه استفاده از برنامه هایی مانند مک آفی یا نورتون به تلاش برای بازیابی داده ها، همه آنها در حال انجام در تلاش است تا بازیابی این شاخه به اصطلاح به کشف کردن که در آن فایل های خود را. و گاهی اوقات نورتون و خواهند گفت: فایل 93٪ قابل بازیابی است. خوب، به چه معنا است؟ این حالت فقط بدان معناست که برخی از فایل های دیگر اتفاقی به پایان رسید تا با استفاده از، بگو، این بیت از فایل اصلی خود را. بنابراین چه چیزی است که در واقع درگیر در دوره نقاهت داده؟ خوب، اگر شما چیزی شبیه ندارد نورتون از پیش نصب شده بر روی کامپیوتر شما، بهترین شما گاهی اوقات می توانید انجام دهید این است نگاه در کل درایو سخت به دنبال الگوهای بیت. و یکی از تم ها از مجموعه مشکل پنج است که شما جستجو خواهد کرد معادل یک هارد دیسک، پزشکی قانونی تصویری از یک کارت کامپکت فلش از دوربین های دیجیتال، جستجو برای 0s و و 1S است که به طور معمول، با بالا به احتمال قوی، نشان دادن شروع یک تصویر JPEG. و شما بچه ها می توانید این تصاویر را با بازیابی فرض کنید، اگر من این الگو را ببینید بیت های در تصویر پزشکی قانونی، با احتمال بالا، که نشانه شروع از JPEG است. و اگر من همان الگو را دوباره ببینم، که احتمالا نشانه ای از شروع JPEG دیگر، و دیگری JPEG و JPEG دیگری. و این است که به طور معمول چگونه بازیابی اطلاعات کار خواهد کرد. چه خبر خوب در مورد عکس JPEG است حتی اگر فرمت فایل خود را تا حدودی پیچیده، در آغاز از هر چنین فایل است که در واقع نسبتا شناسایی و ساده، همانطور که شما خواهید دید، اگر شما در حال حاضر نیست. بنابراین اجازه دهید یک نگاهی از نزدیک زیر هود به عنوان دقیقا همان چیزی است که بوده است در رفتن، و چه این 0s و و 1S هستند، به شما کمی بیشتر از یک زمینه را برای این چالش خاص. [پخش ویدئو] از کجا کامپیوتر شما ذخیره از اطلاعات دائمی آن. برای انجام این کار، داده ها از RAM سفر همراه با سیگنال های نرم افزاری است که می گویند هارد دیسک چگونه برای ذخیره این داده ها. مدارهای هارد دیسک ترجمه این سیگنال ها را به ولتاژ نوسانات. این، به نوبه خود، کنترل هارد دیسک قطعات در حال حرکت، برخی از معدود قطعات متحرک در سمت چپ کامپیوتر های مدرن. برخی از سیگنال های کنترل موتور که چرخش پلاتر فلز پوشش داده شده است. اطلاعات شما ذخیره شده است که در واقع در این پلاتر. سیگنال های دیگر حرکت می کند به خواندن / نوشتن سر به خواندن و یا نوشتن داده بر پلاتر. این ماشین آلات آنقدر دقیق است که انسان مو حتی نمی تواند بین عبور سر نخ ریسی پلاتر. در عین حال، تمام آن را در سرعت های فوق العاده کار می کند. [END پخش ویدئو] دیوید مالان: زوم در کمی عمیق تر در حال حاضر در چه واقع در آن پلاتر. [پخش ویدئو] اجازه دهید نگاهی به آنچه که ما فقط در حرکت آهسته بشه. هنگامی که یک پالس مختصری از برق است فرستاده شده به خواندن / نوشتن سر، اگر flips یک در الکترومغناطیسی کوچک برای کسری از ثانیه است. آهنربا یک میدان، که ایجاد تغییرات قطب های کوچک، کوچک بخشی از ذرات فلزی که کت هر سطح پلاتر. سری الگوی از این کوچک، متهم تا مناطق بر روی دیسک نشان دهنده یک بیت داده ها در عدد دودویی سیستم استفاده شده توسط کامپیوتر. در حال حاضر، اگر در حال حاضر فرستاده شده است یکی از راه های از طریق خواندن / نوشتن سر، منطقه قطبی در یک جهت است. اگر در حال حاضر در فرستاده می شود جهت مخالف، قطبش معکوس شده است. چگونه شما می توانید داده ها را خاموش هارد دیسک؟ فقط این روند معکوس می باشد. پس از آن ذرات بر روی دیسک که در حال حاضر در خواندن / نوشتن سر در حال حرکت است. کنار هم قرار دادن میلیونها نفر از این بخش مغناطیسی، و شما یک فایل رو. در حال حاضر، قطعه از یک فایل ممکن است تواند در سراسر یک درایو پراکنده پلاتر، نوع مانند ظروف سرباز یا مسافر از مقالات در روی میز کار خود را. بنابراین یک فایل اضافی خاص نگه می دارد ردیابی که در آن همه چیز است. آیا می خواهید شما تا به حال چیزی شبیه به آن؟ [END پخش ویدئو] دیوید مالان: خوب، احتمالا نه. پس چگونه بسیاری از شما بچه ها با این بزرگ؟ خوب، پس از آن کمتر و کمتر هر سال دست. اما من خوشحالم که حداقل آشنا هستم با آنها، چرا که این خود ما نسخه ی نمایشی کتاب، متاسفانه، در حال مرگ هستند بسیار کند مرگ از آشنایی. اما این چیزی است که من، حداقل، در دبیرستان، استفاده برای پشتیبان گیری استفاده می شود. و از آن شگفت انگیز بود، چرا که شما می تواند 1.4 مگابایت در فروشگاه این دیسک خاص. و این نسخه با چگالی بالا بود، HD، است که نشان یعنی قبل از امروز فیلم های HD. تراکم استاندارد 800 کیلوبایت بود. و قبل از آن، وجود داشت دیسک 400 کیلوبایت. و قبل از آن، 5 و 1/4 اینچ دیسک، که حقیقتا فلاپی بودند، و کمی گسترده تر و بلندتر از این چیزها در اینجا. اما شما در واقع می توانید ببینید که به اصطلاح فلاپی جنبه از این دیسک. و عملکرد آنها در واقع بسیار شبیه به دیسک های سخت از در حداقل این نوع. باز هم، SSD ها در کامپیوترهای جدیدتر کار کمی متفاوت است. اما اگر شما حرکت که زبانه فلز کمی، شما در واقع می توانید ببینید که یک کوکی کوچک، و یا صفحه گرامافون است. این فلز نه مثل این یکی. این یکی در واقع ارزان تر مواد پلاستیکی. و شما می توانید نوع آن را تکان دادن. و شما trully فقط پاک کردن برخی از تعداد بیت ها یا ذرات مغناطیسی از این دیسک. خوشبختانه، هیچ چیز در آن وجود دارد. در صورتی که چیزی در راه است - و پوشش چشم ها و کسانی که خود را از همسایه خود را - شما فقط می توانید نوع از این جلو کل خاموش غلاف مانند آن. اما یک بهار کمی وجود دارد، بنابراین که با چشم خود آگاه است. بنابراین در حال حاضر شما واقعا یک فلاپی دیسک است. و چه چیزی قابل توجه در مورد این این است که به همان اندازه به عنوان این است نمایندگی کوچک در مقیاس بزرگتر هارد دیسک، این چیزها فوق العاده است، فوق العاده ساده. اگر شما خرج کردن پایین آن، در حال حاضر که چیزی که فلزی و پوست آنها را باز کنید، وجود دارد دو قطعه از احساس و به اصطلاح فلاپی دیسک با یک قطعه فلزی در داخل است. و می رود نیمی از وجود دارد محتویات دیسک من است. می رود یکی دیگر از نیمی از آنها وجود دارد. اما این همه که در داخل در حال چرخش بود کامپیوتر خود را در سال گذشته است. و دوباره، برای قرار دادن به این دیدگاه، چقدر بزرگ است بیشتر از شما هارد درایو این روزها؟ 500 گیگابایت، یک ترابایت، شاید در یک کامپیوتر رومیزی، 2 ترابایت، 3 ترابایت، 4 ترابایت، درست است؟ این یک مگابایت است، دادن و یا گرفتن، که حتی نمی تواند مناسب MP3 معمولی دیگر این روزها، و یا برخی از فایل های موسیقی مشابه. بنابراین سوغات کمی برای شما امروز، و همچنین برای کمک به درمتن چه خواهیم اعطا گرفتن در حال حاضر در مجموعه مشکل پنج. بنابراین کسانی که شما را به نگه دارید. بنابراین اجازه دهید من گذار که در آن خواهد بود صرف pset بعدی نیز هست. بنابراین ما در حال حاضر این صفحه برای - اوه، یک زن و شوهر از اطلاعیه به سرعت. این جمعه، اگر شما می خواهم پیوستن به CS50 برای ناهار، به جای معمول، cs50.net/rsvp. و پروژه نهایی - بنابراین در هر برنامه درسی، ما ارسال شده ایم مشخصات پروژه نهایی در حال حاضر. را فهم کنید که این بدان معنا نیست آن را به علت به خصوص به زودی. ارسال شده در، واقعا، فقط برای گرفتن شما بچه ها فکر کردن درباره آن. و در واقع، فوق العاده قابل توجه درصد از شما خواهد شد مقابله با پروژه های نهایی در مورد مواد است که ما حتی در کلاس و بعد فورا رفت واز، اما به عنوان اوایل هفته آینده خواهد شد. مقررات، هر چند که تنظیمات خواستار چند اجزای مختلف پروژه نهایی. برای اولین بار، در چند هفته، قبل از پیشنهاد، یک ایمیل خیلی گاه به گاه به های TF خود را به او بگویید و یا آنچه شما هستید فکر کردن در مورد پروژه خود را، با بدون تعهد. پیشنهاد خاص خود خواهد بود تعهد، گفت، در اینجا، این همان چیزی است که من می خواهم برای پروژه من انجام دهد. شما چه فکر میکنید؟ بیش از حد بزرگ است؟ بیش از حد کوچک است؟ آیا آن قابل کنترل است؟ و شما می بینید که تنظیمات برای جزئیات بیشتر. چند هفته پس از آن وضعیت است گزارش، که به طور مشابه ایمیل های گاه به گاه به TF خود را به می گویند چگونه دور پشت سر شما در نهایی خود را اجرای پروژه، به دنبال Hackathon CS50 که هر کس دعوت شده است، که خواهد شد یک رویداد 8:00 روزهای یک بعد از ظهر تا 7:00 AM صبح روز بعد. پیتزا، به عنوان من ممکن است در هفته ذکر شده صفر، به آرامی در ساعت 9:00 PM خدمت کرده است، مواد غذایی چینی در 1:00 AM. و اگر شما هنوز هم بیدار در 5:00 هستید AM ما شما را برای صبحانه IHOP. بنابراین Hackathon یکی از بیش است تجربه های به یاد ماندنی در کلاس. سپس پیاده سازی شده است به علت، و در اوجی CS50 نمایشگاه. جزئیات بیشتر در تمام این در هفته آمده است. اما اجازه دهید به عقب برویم به چیزی مدرسه قدیمی - دوباره، یک آرایه. بنابراین یک آرایه خوب بود، به دلیل آن را حل میکند مشکلات مثل ما دیدم تنها لحظه ای پیش با سازه های دانش آموزان گرفتن کمی از کنترل اگر ما می خواهم به دانش آموز، دانشجو، دو، دانش آموزان سه، دانشجوی نقطه نقطه نقطه، برخی تعداد خودسرانه از دانش آموزان. بنابراین آرایه ها، چند هفته پیش، swooped و حل تمام مشکلات ما نیست دانستن در پیشبرد چگونگی بسیاری از چیزهای برخی از نوع ما ممکن است بخواهید. و ما دیده ایم که ساختمانها می تواند ما را کمک کند کد ما بیشتر سازماندهی و حفظ متغیرهای مفهومی مشابه، مانند نام و یک خانه، با هم، به طوری که ما می توانید آنها را به عنوان یک نهاد، در داخل درمان که قطعات کوچکتر وجود دارد. اما آرایه برخی از معایب. برخی از معایب چه هستند ما مواجه می شوند با آرایه ها تا کنون؟ چه خبر؟ اندازه ثابت - بنابراین حتی اگر شما ممکن است قادر به اختصاص دادن حافظه برای آرایه، هنگامی که شما می دانید که چگونه بسیاری از دانش آموزان شما داشته باشد، که چگونه بسیاری از شخصیت شما از کاربر، یک بار شما اختصاص داده ام آرایه، شما به نوعی نقاشی خود را به کرنر زد. از آنجا که شما می توانید عناصر جدیدی وارد کنید به وسط یک آرایه. شما می توانید عناصر بیشتری وارد کنید در پایان از یک آرایه. در واقع، شما مجبور به توسل به ایجاد یک آرایه کاملا جدید، همانطور که بحث شد، کپی کردن قدیمی به جدید است. و دوباره، که سردرد است که از GetString معاملات با شما. اما باز هم، شما می توانید حتی وارد چیزی به میانه از آرایه اگر نرخ به طور کامل پر نشده است. به عنوان مثال، در صورتی که این آرایه در اینجا از اندازه شش تنها دارای پنج چیز در آن است، خوب، شما می توانید فقط رویه چیزی را به انتهای. اما چه می شود اگر شما می خواهید برای قرار دادن چیزی به وسط آرایه، حتی اگر آن را ممکن است پنج نفر از شش چیز در آن است؟ خوب، چه کار می کنیم زمانی که ما تا به حال تمام از داوطلبان انسانی ما روی صحنه در هفته گذشته؟ اگر ما می خواستیم برای قرار دادن کسی در اینجا، یا این افراد چگونه به حرکت در این راه، و یا این که چگونه مردم به حرکت در این راه، و که گران شد. تغییر از مردم در داخل آرایه به پایان رسید تا اضافه کردن و هزینه ما زمان، از این رو بسیاری از N مربع ما زمان در حال اجرا مانند مرتب سازی بر درج، به عنوان مثال، در بدترین حالت. بنابراین آرایه های بزرگ هستند، اما شما را به بدانید که در پیشبرد چقدر بزرگ آنها را می خواهید. بنابراین خوب، در اینجا یک راه حل است. اگر من را در پیشبرد دانم که چگونه بسیاری دانش آموزان من ممکن است، و من می دانم که یک بار من تصمیم می گیرید، هر چند، من با آن گیر کرده است بسیاری از دانش آموزان، چرا من نه فقط همیشه اختصاص فضای دو برابر که من ممکن است فکر می کنم من نیاز دارید؟ این است که یک راه حل منطقی نیست؟ در واقع، من فکر نمی کنم که ما رفتن به نیاز به بیش از 50 اسلات در یک آرایه برای یک کلاس با اندازه متوسط، بنابراین اجازه دهید فقط دور تا. من 100 اسلات در آرایه من را، فقط به طوری که ما قطعا می توانید تعدادی از دانش آموزان من به انتظار در برخی از کلاس با اندازه متوسط ​​باشد. پس چرا نه تنها دور تا و تخصیص حافظه بیشتر، به طور معمول، به صورت یک آرایه از شما فکر می کنم شما حتی ممکن است نیاز؟ این مقاومت مواجه ساده چه خبر به این ایده است؟ شما فقط اتلاف حافظه است. به معنای واقعی کلمه در هر برنامه شما می نویسم و ​​سپس شاید با استفاده از حافظه دوبرابر شما در واقع نیاز دارند. و این فقط مثل احساس نمی به خصوص محلول زیبا. علاوه بر این، آن را تنها کاهش می یابد احتمال یک مشکل. اگر شما اتفاق می افتد به یک دوره محبوب یک ترم و شما باید 101 دانش آموزان، برنامه خود را هنوز هم اساسا این مسئله روبرو می. خوشبختانه، یک راه حل وجود دارد این آگهی تمام مشکلات خود را در فرم از ساختارهای داده ای است که پیچیده تر از آنهایی که ما تا کنون دیده ام. ، من ادعا می کنند، این یک لیست پیوندی است. این یک لیست از اعداد است - 9، 17، 22، 26، و 34 - که کرده اند با هم از طریق مرتبط از آنچه که من به عنوان فلش گرفته ایم. به عبارت دیگر، اگر من می خواستم برای نشان دادن یک آرایه، من می تواند انجام دهد چیزی شبیه به این. و من این کار را در بالای سر قرار داده است فقط یک لحظه. من می توانم انجام دهید - سلام، همه حق است. ایستاده. کامپیوتر جدید در اینجا، روشن - بسیار خوب. بنابراین اگر من این اعداد در آرایه - 9، 17، 22، 26، 24 - نه لزوما به مقیاس. همه حق است، بنابراین در اینجا آرایه من است - آه خدای من. همه حق است، بنابراین در اینجا آرایه من است. آه خدای من. [خنده حضار] دیوید مالان وانمود. این تلاش بیش از حد به عقب و رفع، به طوری که وجود دارد - 26. بنابراین ما باید این آرایه 9، 17، 22، 26، و 34. برای کسانی از شما می توانید ببینید اشتباه شرم آور من فقط ساخته شده، وجود دارد آن است. بنابراین من ادعا می کنند که این یک راه حل بسیار موثر است. من به عنوان بسیاری به عنوان نوع داده int اختصاص داده ام من نیاز - یک، دو، سه، چهار، پنج و شش - و من پس از آن ذخیره می شود تعداد در داخل این آرایه است. اما فرض کنید، پس از آن، من می خواهم برای وارد کردن ارزش مانند عدد 8؟ خب، کجا برود؟ فرض کنید من می خواهم برای وارد کردن یک تعدادی مثل 20. خب، کجا برود؟ در جایی در وسط وجود دارد، یا شماره 35 به جایی در پایان. اما من همه از فضا هستم. و بنابراین این یک چالش اساسی است از آرایه می کند که راه حل. من ادعا کردم چند لحظه پیش، GetString این مشکل را حل میکند. اگر می خواهید برای قرار دادن تعداد ششم به این آرایه، چه حداقل یک راه حل شما می توانید در سقوط برای مطمئن، درست مثل ما با GetString انجام دهید؟ چه خبر؟ خوب، آن را به بزرگتر است آسان تر از انجام گفت. ما نمی توانیم لزوما آرایه بزرگتر، اما چه می توانیم بکنیم؟ ایجاد یک آرایه جدید است که بزرگتر از اندازه 6، و یا شاید اندازه 10، اگر ما می خواهیم جلوتر از همه چیز، و سپس کپی کنید آرایه های قدیمی به جدید، و سپس آزادی آرایه قدیمی. اما آنچه در حال اجرا است در حال حاضر از این روند؟ O بزرگ از n است، چرا که کپی کردن رفتن به شما هزینه برخی از واحدهای زمان، آن، بنابراین ایده آل نیست اگر ما باید به تخصیص یک آرایه جدید است که به مصرف دو برابر حافظه به طور موقت. کپی قدیمی به جدید - منظورم این است که، آن را فقط یک سردرد، که است، دوباره، به همین دلیل ما نوشت GetString برای شما. پس چه ممکن است ما به جای انجام دهید؟ خوب، اگر ساختار داده ما در واقع شکاف در آن؟ فرض کنید که من هدف من از داشتن آرامش تکه های به هم پیوسته از حافظه، که در آن 9 درست در کنار به 17، است که درست در کنار به 22، و غیره. و فرض کنید که 9 می تواند بر اینجا در رم، و 17 را می توان در اینجا در رم بیش از حد، و 22 را می توان در اینجا در رم بیش از حد است. به عبارت دیگر، من نیازی به آنها ندارند حتی پشت به پشت دیگر. من فقط باید به نحوی یک سوزن موضوع از طریق هر یک از این اعداد، و یا هر از این گره ها، به عنوان ما تماس بگیرید مستطیل که من آنها را کشیده ام، به به یاد داشته باشید چگونه می توانید به گذشته چنین گره از اول. پس چه شده است به برنامه نویسی ساخت ما کاملا به تازگی دیده ام که با من می تواند به این موضوع پیاده سازی، یا کشیده شده در اینجا، که با آن من می توانم اجرای این فلش؟ اشاره گر بنابراین، درست است؟ اگر من اختصاص نه فقط INT، اما یک گره - و گره، من فقط به این معنی ظرف. و بصری، منظورم این است که یک مستطیل است. بنابراین یک گره ظاهرا نیاز شامل دو مقدار - بین المللی خود، و پس از آن، به عنوان ضمنی نیمه پایین مستطیل، فضای کافی برای یک int. پس فقط با فکر کردن به آینده، چقدر بزرگ این گره است، این ظرف در سوال؟ چگونه بسیاری از کلمه در ادامه متن برای اعضای هیات؟ احتمالا 4، اگر آن را به طور معمول. و پس از آن چند بایت برای اشاره گر؟ 4. بنابراین این ظرف، و یا این گره، رفتن به ساختار 8 بایتی. اوه، و این یک تصادف خوشحال است که ما فقط به معرفی این مفهوم یک ساختار یا ساختار C. بنابراین من ادعا می کنند که من می خواهم را به مرحله نسبت به این پیچیده تر اجرای یک لیست از اعداد، لیست پیوندی از اعداد، من نیاز به انجام تفکر کمی بیشتر جلو و اعلام نه فقط یک int، اما ساختار که من تماس بگیرید، مرسوم در اینجا، گره. ما می تواند از آن را هر چیزی که ما می خواهیم تماس بگیرید، اما گره رفتن به موضوعی در بسیاری از چیزهایی که ما شروع به دنبال در حال حاضر. داخل آن گره N عدد صحیح است. و سپس این نحو، کمی عجیب و غریب در نگاه اول - ساختار گره * بعدی. خوب pictorially، این است که؟ که در نیمه پایین است مستطیل است که ما دیدم فقط یک لحظه قبل در دیتا بیس ثبت شده است. اما چرا من گفت: ساختار گره * به عنوان مخالف به فقط گره *؟ از آنجا که در صورتی که اشاره گر اشاره در یکی دیگر از گره، آن را فقط به آدرس یک گره. که مطابق با آنچه که ما در باره اشاره گر تا کنون. اما چرا، اگر من ادعا می کنند این ساختار است به نام گره، می توانم به ساختار می گویند گره در داخل اینجا؟ دقیقا. مرتب کردن بر اساس یک واقعیت احمقانه C. typedef، پس به صحبت می کنند، نه اتفاق افتاده است. C فوق العاده تحت اللفظی است. این بار خوانده شده بالای کد خود را به پایین، چپ به راست. و تا زمانی که بازدید که نقطه و ویرگول بدین خط پایین، حدس می زنم آنچه را نمی کند به عنوان یک نوع داده وجود دارد؟ گره، گره نقل قول نقل قول را تمام کردن. اما به دلیل طولانی بیانیه من در خط اول - typedef گره ساختار - چرا که برای اولین بار آمد، قبل از آکولاد، که مرتب سازی بر اساس مانند صدای جرنگ جرنگ آموزش قبل از آن، شما دانید، من یک struct را به نام گره ساختار. صادقانه بگویم، من خواستار چیزهای را دوست ندارد ساختار گره، ساختار گره همه در سراسر کد من. اما من فقط آن را یک بار استفاده، فقط در داخل، به طوری که من می تواند به طور موثر ایجاد یک نوع از مرجع مدور، نه یک اشاره گر به خودم فی نفسه است، اما اشاره گر به یکی دیگر از یک نوع یکسان است. بنابراین معلوم است که در یک ساختار داده ها مانند این، چند وجود دارد عملیات که ممکن است از علاقه به ما. ما در صورت تمایل به درج به یک لیست مثل این. ما ممکن است بخواهید را حذف کنید از لیست مانند این. ما ممکن است بخواهید به جستجوی لیست ارزش، یا به طور کلی تر، تراورس. و با گذشتن تنها راه فانتزی گفت: شروع در سمت چپ و move نمایش دوباره و تجزیه و تحلیل تمام راه را به سمت راست است. و توجه، حتی با این کمی بیشتر ساختار داده های پیچیده، اجازه دهید من پیشنهاد می کنند که ما می توانیم برخی از قرض ایده دو هفته گذشته و پیاده سازی یک تابع به نام جستجو مانند این. آن را به بازگشت درست است یا نادرست، نشان می دهد، آری یا نه نفر در لیست است. آرگومان دوم آن یک اشاره گر است به لیست خود، به طوری که اشاره گر به گره. من قصد دارم پس از آن انجام شده است اعلام یک متغیر موقت است. ما آن را PTR توسط کنوانسیون تماس بگیرید، اشاره گر. و من اختصاص آن را به برابر آغاز از لیست. و در حال حاضر متوجه حلقه while. تا زمانی به عنوان اشاره گر برابر نیست به تهی، من قصد دارم به بررسی کنید. آیا اشاره گر فلش N برابر N که در به تصویب رسید؟ و یک دقیقه صبر کنید - جدید قطعه ای از نحو. فلش همه ناگهانی چیست؟ آره؟ دقیقا. بنابراین در حالی که چند دقیقه پیش، ما با استفاده از نماد نقطه برای دسترسی به چیزی در داخل یک ساختار، اگر متغیر شما ساختار خود را، اما یک اشاره گر به ساختار، خوشبختانه، یک قطعه نحو که در نهایت باعث می شود حس بصری. فلش بدان معنی است که به پیروی از اشاره گر، مانند پیکان ما به طور معمول به معنای در pictorially، و در زمینه داده ها در داخل. بنابراین، فلش همان نقطه است، اما شما از آن استفاده کنید زمانی که شما یک اشاره گر. بنابراین فقط به روکش و سپس، اگر زمینه N داخل ساختار به نام اشاره گر برابر برابر N، بازگشت درست است. در غیر این صورت، این خط در اینجا - اشاره گر برابر است با اشاره گر بعدی است. بنابراین چه چیزی این انجام شده است، توجه، این است اگر من در حال حاضر در ساختار اشاره حاوی 9، و 9 عدد نیست من به دنبال - فرض کنید من به دنبال برای n برابر است با 50 - من قصد دارم برای به روز رسانی اشاره گر موقت من در این گره نقطه دیگر، اما اشاره گر arrow بعدی، که به من قرار داده تا در اینجا. در حال حاضر، من متوجه شدم یک گردباد است مقدمه. در تاریخ چهارشنبه، ما در واقع می خواهیم این کار را انجام با بعضی از انسان ها و با برخی بیشتر کد در سرعت کند تر. اما متوجه باشید، ما در حال حاضر ساخت داده های ما ساختارهای پیچیده تر به طوری که ما الگوریتم می تواند کارآمد تر، که رفتن به نیاز برای pset شش، زمانی که ما در بار، دوباره، کسانی که 150،000 کلمه، اما نیاز به انجام این کار کارآمد، و ایده آل، ایجاد یک برنامه اجرا می شود که کاربران ما نه در خطی، نه در n مربع است، اما در زمان ثابت، در ایده آل است. ما شما را در روز چهارشنبه را ببینید. SPEAKER: در CS50 بعد، دیوید فراموش حالت پایه خود را. دیوید مالان: و این که چگونه شما ارسال پیام های متنی با C. - [مختلف متن پیام اطلاع رسانی برای تلفن های موبایل]