[Powered by Google Translate] [هفته 4]
[دیوید J. مالان] [دانشگاه هاروارد]
[این CS50.] [CS50.TV]
>> کلیه حقوق این CS50 است، و این است که شروع هفته 4
و این یکی از الگوریتم های مرتب سازی کمترین امکان پذیر است.
کدام یک از این بود که ما فقط به تماشای وجود دارد؟
که مرتب سازی بر حباب بود، به منظور بزرگ O (n ^ 2) + مجموع،
و در واقع ما تنها کسانی در این دنیا هستند که به نظر می رسد به دانستن
چه نوع حباب است و یا در حال اجرا در زمان خود است.
در واقع، این یک مصاحبه با اریک اشمیت از گوگل بود
و سناتور سابق باراک اوباما، تنها چند سال پیش.
>> در حال حاضر، سناتور شما در گوگل
و من می خواهم به ریاست جمهوری فکر می کنم به عنوان یک مصاحبه شغلی.
در حال حاضر، آن را سخت به کار خود به عنوان ریاست جمهوری، و شما را از طریق رفتن به rigors در حال حاضر است.
این هم سخت است برای به دست آوردن یک شغل در گوگل.
ما سوالات، و ما از نامزدهای سوالات ما،
و این یکی از لری Schwimmer.
شما بچه ها فکر می کنم من شوخی؟ این حق در اینجا.
کارآمد ترین راه برای مرتب کردن یک میلیون عدد صحیح 32 بیتی چیست؟
[خنده]
خوب
من متاسفم. >> نه، نه، نه، نه.
من فکر می کنم که مرتب سازی بر حباب خواهد بود که از راه نادرست به رفتن.
>> بیا، که به او گفت این؟
هفته گذشته به خاطر ما در زمان استراحت از کد، حداقل برای یک روز،
و شروع به تمرکز بر روی برخی از ایده های سطح بالاتر و حل مسئله به طور کلی
در زمینه جستجو و مرتب سازی،
و ما چیزی است که ما این نام را در هفته گذشته با کف دست زدن نیست،
اما نماد مجانبی، O بزرگ، امگا بزرگ،
و گاهی اوقات بزرگ نماد تتا، و این به سادگی راه
توصیف زمان اجرای الگوریتم،
چه مقدار زمان آن را برای یک الگوریتم برای اجرا طول می کشد.
>> و شما ممکن است به یاد داشته باشید که شما را در مورد زمان در حال اجرا صحبت کردیم از نظر اندازه
از ورودی، که ما به طور کلی تماس بگیرید N، هر آنچه که ممکن است مشکل باشد،
که در آن N تعداد زیادی از مردم که در اتاق است،
تعدادی از صفحات در یک دفترچه تلفن، و ما شروع به نوشتن چیز
مانند O (N ^ 2) و O (N) یا O (n log n است)،
و حتی زمانی که ریاضی کاملا کار نمی کند به طوری که کاملا
و آن را N بود ² - N / 2 و یا چیزی شبیه به آن
ما در عوض فقط دور انداختن برخی از قوانین نظم کمتر،
و انگیزه این است که ما واقعا می خواهید وجود دارد
مرتب کردن بر اساس راه هدف از ارزیابی
عملکرد برنامه یا عملکرد الگوریتم
که در پایان روز از هیچ چیزی برای انجام، برای مثال،
با سرعت از کامپیوتر شما.
>> به عنوان مثال، اگر شما پیاده سازی مرتب سازی بر حباب،
یا شما پیاده سازی ادغام مرتب سازی بر اساس مرتب سازی بر اساس انتخاب و یا بر روی کامپیوتر امروز،
2 گیگاهرتز کامپیوتر، و شما آن را اجرا کنید.
و آن را از چند ثانیه طول می کشد، در سال آینده به 3 گیگاهرتز وجود دارد
یا 4 گیگاهرتز کامپیوتر، و بعد از آن شما ممکن است که "وای، الگوریتم من ادعا
در حال حاضر دو برابر به عنوان سریع، زمانی که در واقعیت است که بدیهی است که نمی.
این فقط سخت افزار و بعد فورا رفت واز سریعتر، اما کامپیوتر شما
است، نیست و بنابراین ما واقعا می خواهید به دور انداختن چیزهایی مانند
مضربی از 2 یا مضربی از 3 هنگامی که آن را به توصیف می آید
چگونه سریع و یا چگونه آهسته الگوریتم و واقعا فقط تمرکز
در N و یا برخی از عوامل آن،
برخی از قدرت آن به عنوان در مورد انواع از هفته گذشته است.
و به یاد آورید که با کمک مرتب کردن بر اساس ادغام
ما قادر به انجام این کار بسیار بهتر از مرتب سازی حبابی و مرتب سازی بر اساس انتخاب
و حتی مرتب کردن بر اساس درج.
>> ما رو به n log n است، و دوباره،
به یاد داشته باشید که ورود N به طور کلی به چیزی است که رشد می کند اشاره دارد
آهسته تر و سپس N، بنابراین N ورود N تا کنون خوب بود
به دلیل آن بود کمتر از ² N.
اما برای رسیدن به n log n استفاده با مرتب کردن بر اساس ادغام
چه بود جوانه اولیه از یک ایده است که ما تا به حال به اهرم
که ما نیز در هفته 0 قوی تر است؟
چگونه مشکل مرتب سازی بر مقابله هوشمندانه با مرتب سازی بر ادغام؟
چه بینش کلیدی بود، شاید؟
هر کسی در همه.
خوب، اجازه دهید یک قدم به عقب.
شرح بر حسب موجود در کلمات خود به ادغام.
چگونه کار می کند؟
خوب، ما ردیف را به 0 هفته.
خوب، آره.
[نامفهوم دانشجو]
خوب، خوب است، پس ما آرایه ای از اعداد را به 2 تکه تقسیم شده است.
ما طبقه بندی شده اند هر یک از آن قطعه، و سپس ما آنها را با هم ادغام شدند،
و ما این ایده را دیده ام قبل از اینکه یک مشکل است که این بزرگ
و سفت آن را به یک مشکل است که این بزرگ یا بزرگ.
>> یاد مثال کتاب تلفن.
به یاد بیاورید الگوریتم شمارش را از هفته پیش،
بنابراین ادغام مرتب سازی بر اساس این شبه در اینجا خلاصه شد.
هنگامی که شما با توجه به عناصر N، برای اولین بار آن را در سلامت عقل را چک کنید.
اگر N <2 پس از آن هیچ چیز را انجام دهد نه در همه
زیرا اگر n <2 آنگاه N واضح است که 0 یا 1،
و بنابراین اگر آن را یا 0 یا 1 چیزی برای مرتب سازی وجود دارد.
شما انجام می شود.
لیست شما در حال حاضر جزئیات طبقه بندی شده اند.
اما در غیر این صورت اگر شما 2 یا چند عنصر به جلو بروید و تقسیم آنها
به 2 نیمه، چپ و راست.
مرتب کردن بر اساس هر یک از آن دو نیمه، و سپس ادغام نیمه های طبقه بندی شده اند.
اما مشکل در اینجا این است که در نگاه اول احساس می کند مانند ما در حال punting.
این تعریف دایره ای است که در آن اگر من از شما خواسته ام برای مرتب کردن این عناصر N
و شما به من گفتن همه درست، خوب، خواهیم کسانی که عناصر N / 2 و کسانی که N / 2 مرتب کردن بر اساس،
سپس سوال بعدی من این است که رفتن به "زیبا، چگونه می توانم N / 2 عناصر مرتب سازی بر اساس؟"
>> اما از آنجا که ساختار از این برنامه،
زیرا این حالت پایه وجود دارد، پس به صحبت می کنند،
این مورد ویژه ای است که می گوید: اگر n <بلافاصله برخی از ارزش های ثابت مانند 2 بازگشت.
که با همان جواب مدور پاسخ نمی دهند.
این فرایند، این cyclicity سرانجام به پایان خواهد رسید.
اگر من شما را از "مرتب سازی بر اساس این عناصر N،" و به شما می گویند، "زیبا، مرتب این N / 2،
پس از آن به شما می گویند، "زیبا، مرتب کردن بر اساس این N / 4، N / 8، n/16،
در نهایت شما با یک شماره به اندازه کافی بزرگ تقسیم
که شما فقط 1 عنصر سمت چپ، که در آن شما می توانید می گویند،
"در اینجا، در اینجا یک عنصر طبقه بندی شده اند تنها است."
پس از آن درخشش از این الگوریتم تا اینجا این است که از این واقعیت گرفته شده است
که هنگامی که شما همه از این لیست های جداگانه طبقه بندی شده اند،
که همه آنها از نظر اندازه (1)، که به نظر می رسد بی فایده است،
هنگامی که شما شروع به ادغام آنها و ادغام آنها
شما ساخت تا در نهایت به عنوان راب در فیلم فهرست طبقه بندی شده اند در نهایت.
>> اما این ایده گسترش بسیار فراتر از مرتب سازی.
این ایده تعبیه شده در این برنامه شناخته شده به عنوان بازگشت وجود دارد،
این ایده است که در آن شما یک برنامه
و برای حل بعضی از مشکل شما به خودتان تماس بگیرید،
و یا قرار دادن در زمینه زبان های برنامه نویسی شما یک تابع،
و به منظور حل یک مشکل، شما تابع خودتان تماس بگیرید
دوباره و دوباره و دوباره، اما شما از تابع
نمی تواند خود را بی نهایت بسیاری تماس بگیرید.
در نهایت شما باید به پایین خارج، پس به صحبت می کنند،
و برخی از شرایط hard-coded بودن پایه که می گوید:
در این نقطه متوقف فراخوانی خود را به طوری که کل فرایند
در نهایت می کند در واقع متوقف شود.
چه این در واقع، به RECURSE چیست؟
>> بیایید ببینید، اگر ما می تواند، به عنوان مثال پیش پا افتاده و ساده را انجام دهید، می گویند،
3 نفر با من تا اینجا به روی صحنه، اگر کسی راحت است.
1، تا، 2 و 3 آمده است.
اگر شما 3 می خواهم به اینجا می آیند تا.
اگر شما می خواهید برای ایستادن در کنار من در اینجا در یک خط، فرض کنید که این مشکل در دست
بسیار به جزئیات تعداد از افرادی که در اینجا هستند.
اما صادقانه بگویم، من خسته از تمام این مثالها شمارش.
این امر را به برخی از زمان، 1، 2، و نقطه، نقطه، نقطه.
این رفتن را به برای همیشه لطفا برای.
من ترجیح می دهم فقط میفرستتون این مشکل در مجموع با کمک چه نام شما؟
سارا. >> سارا، همه حق است.
کلی. >> کلی و
>> ویلی. >> ویلی، سارا، کلی، و ویلی.
در حال حاضر من به سوال کسی که خواسته
چگونه بسیاری از مردم در این مرحله، و من هیچ نظری ندارم.
این واقعا یک لیست طولانی است، و بنابراین به جای من قصد دارم برای انجام این ترفند.
من قصد دارم به درخواست شخصی که در کنار به من برای انجام بسیاری از کار،
و یک بار او انجام بسیاری از کار انجام شده است
من قصد دارم برای انجام حداقل میزان کار امکان پذیر است و فقط اضافه کردن 1
به هر پاسخ او است، بنابراین در اینجا ما.
من پرسیده شده است که چگونه بسیاری از مردم به روی صحنه هستند.
چگونه بسیاری از مردم به روی صحنه به سمت چپ از شما هستند؟
در سمت چپ من؟ >> خوب، اما تقلب نیست.
این خوب است، این درست است، اما اگر ما می خواهیم به این منطق
اجازه دهید فرض کنیم که شما به طور مشابه به میفرستتون این مشکل را به سمت چپ از شما می خواهم،
تا به جای پاسخ به طور مستقیم به جلو بروید و فقط تصویب جفتک انداختن.
آه، چگونه بسیاری از مردم را به سمت چپ من؟
چگونه بسیاری از مردم را به سمت چپ؟
1.
[خنده]
خوب، پس 0، پس چه در حال حاضر ویلی انجام داده است
این است که شما بازگردانده پاسخ خود را در این راستا گفت: 0.
در حال حاضر، آنچه که باید شما انجام دهد؟ >> 1.
خوب، پس شما 1، به طوری که به شما می گویند، "خوب، من قصد دارم برای اضافه کردن (1)
به هر تعداد ویلی بود، "1 + 0.
شما در حال حاضر 1 تا پاسخ خود را به سمت راست در حال حاضر
1. >> و معدن خواهد بود 2.
خوب است، پس شما پاسخ قبلی، از مجموع 1،
اضافه کردن مقدار حداقل از کار می خواهید انجام دهید، که +1.
شما در حال حاضر 2، و بعد از آن شما به دست من که ارزش؟
3، منظور من، با عرض پوزش، 2.
خوب است.
>> خوب، ما تا به حال 0 به سمت چپ.
بعد از آن ما تا به حال 1 و سپس 2 ما اضافه کنید
و در حال حاضر شما در حال تحویل به من شماره 2،
و به همین ترتیب من و گفت: بسیار خوب، +1، 3.
در واقع 3 نفر ایستاده در کنار من در این مرحله وجود دارد،
بنابراین ما می توانیم به وضوح انجام این بسیار خطی،
بسیار در مد واضح، اما چه ما واقعا؟
ما در زمان مشکل اندازه 3 در ابتدا.
سپس ما آن را خراب به یک مشکل با اندازه 2،
پس مشکل از اندازه 1، و سپس در نهایت مورد پایه
بود واقعا، آه، هیچ کس وجود دارد،
که در آن نقطه ویلی بازگشت به طور موثر پاسخ hard-coded بودن یک زن و شوهر از بار،
و دوم پس از آن حباب ایجاد شد، حباب، حباب،
و سپس با اضافه کردن در این 1 یک اضافی
ایم به پیاده سازی این ایده اولیه بازگشت.
>> در حال حاضر، در این مورد واقعا نه حل مشکل
هر بیشتر به طور موثر پس از آن ما تا کنون دیده ایم.
اما فکر می کنم در مورد الگوریتم های ما که بر روی صحنه انجام می شود تا کنون.
ما 8 تکه های کاغذ را بر روی تخته سیاه بود،
بر روی ویدئو در زمانی که شان به دنبال شماره 7 بود، و آنچه او واقعا؟
خب، او از هر نوع تقسیم نیست و فتح.
او هر نوع بازگشت نمی کنند.
بلکه او فقط به این الگوریتم خطی است.
اما هنگامی که ما به معرفی این ایده از اعداد طبقه بندی شده اند بر روی صحنه زندگی می کنند در هفته گذشته
پس از آن ما تا به حال این غریزه از رفتن به وسط،
که در آن نقطه، ما تا به حال فهرست کوچکتر از اندازه 4 یا یک لیست از اندازه 4،
و پس از آن ما تا به حال این مشکل همان است، بنابراین ما تکرار، تکرار، تکرار شده است.
به عبارت دیگر، ما recursed.
با تشکر از شما بسیار به ما 3 داوطلبان در اینجا برای نشان دادن بازگشت با ما.
>> بیایید ببینیم که اگر ما می توانیم این را ندارد در حال حاضر بتن کمی بیشتر،
حل یک مشکل که دوباره ما خیلی به راحتی می تواند انجام دهد،
اما ما آن را به عنوان یک سنگ پله به پیاده سازی این ایده اولیه استفاده کنید.
اگر من می خواهم برای محاسبه مجموع یک دسته از اعداد،
به عنوان مثال، اگر شما در شماره 3،
من می خواهم به شما ارزش سیگما 3،
بنابراین مجموع 3 + 2 + 1 + 0.
من می خواهم به پاسخ 6
بنابراین ما می خواهیم این تابع سیگما، پیاده سازی این تابع جمع
که، باز هم، طول می کشد در ورودی، و پس از آن را برمی گرداند به جمع
از این تعداد، همه راه را به پایین تا 0.
ما می توانیم این خیلی به سادگی انجام دهید، درست است؟
ما می توانیم این کار را انجام دهید، با نوعی از ساختار حلقه
پس مرا پیش بروید و اجازه دهید این آغاز شده است.
>> شامل stdio.h.
اجازه بدهید خودم مرا به اصلی به کار در اینجا.
بیایید نجات این به عنوان sigma.c.
سپس من قصد دارم در اینجا، و من قصد دارم به اعلام N از نوع int،
و من قصد دارم به انجام موارد زیر در حالی که کاربر به همکاری نشد.
در حالی که کاربر داده نشده است من یک عدد مثبت
اجازه بدهید من بروم جلو و سریع آنها را برای GetInt = N،
و اجازه دهید من به آنها برخی از دستورالعمل ها را به آنچه به انجام می دهد،
بنابراین printf ("عدد صحیح مثبت است لطفا").
تنها چیزی نسبتا ساده مثل این که در آن زمان ما ضربه خط 14
ما در حال حاضر احتمالا یک عدد صحیح مثبت در N.
>> حال انجام کاری با آن بگذارید.
اجازه بدهید من بروم جلو و محاسبه جمع، به طوری که عناصر لیست int sum = سیگما (N).
سیگما فقط جمع، بنابراین من فقط به نوشتن آن در راه خیال باف.
ما فقط آن را سیگما وجود دارد تماس بگیرید.
این مجموع، و در حال حاضر من قصد دارم برای چاپ کردن و در نتیجه،
printf ("مجموع٪ D، \ N"، مجموع).
و پس از آن من 0 برای اندازه گیری خوب بازگشت.
ما هر آنچه را که این برنامه نیاز به جز قسمت جالب انجام شده است،
است که در واقع پیاده سازی تابع سیگما.
>> اجازه بدهید من به پایین به پایین، و اجازه دهید تابع سیگما اعلام من.
این را به یک متغیر که از نوع صحیح،
و چه نوع داده را من می خواهم به بازگشت احتمالا از شرکت سیگما؟
INT، چون من می خواهم آن را به مطابقت با انتظارات من در خط 15.
در اینجا به من اجازه رفتن به جلو و اجرای این
در راه خیلی ساده است.
>> اجازه دهید به جلو بروید و می گویند مجموع نوع int = 0،
و در حال حاضر من قصد دارم کمی حلقه for در اینجا
که خواهند گفت چیزی شبیه به این،
برای (من بین المللی = 0؛ I <= شماره، من + +) مجموع + = من.
و سپس من قصد دارم به بازگشت از مجموع.
من می توانستم این کار را در هر تعداد از راه به اجرا در آمد.
من حلقه در حالی که می توانست مورد استفاده قرار گیرد.
من می توانم با استفاده از متغیر مجموع اگر من واقعا می خواستم به قلم،
اما در کوتاه مدت، ما فقط یک تابع است که اگر من شخص احمق و کودن اعلام کرد مجموع 0 است.
سپس آن را از 0 تا تکرار از طریق شماره
و در هر تکرار آن اضافه می کند که ارزش فعلی مجموع و پس از آن را برمی گرداند مجموع.
>> در حال حاضر، یک بهینه سازی جزئی در اینجا وجود دارد.
این است که احتمالا یک گام به هدر رفته است، اما می شود آن را. که در حال حاضر خوب است.
ما حداقل هستیم که کامل و رفتن ها 0 راه در تا.
بسیار سخت و بسیار سرراست است،
اما معلوم است که با استفاده از تابع سیگما ما فرصت
که ما در اینجا به روی صحنه بود.
در مرحله ما فقط شمارش که چگونه بسیاری از مردم در کنار من بودند،
اما در عوض اگر ما می خواستیم به تعداد 3 + 2 + 1
در پایین تا 0، می تواند به طور مشابه زدن توپ به یک تابع
که من به جای می خواهید به عنوان بازگشتی توضیح دهید.
عاقلی سریع چک کنید و مطمئن شوید که من انجام دادم خیط و پیت کردن نیست اینجا.
>> من می دانم که حداقل یک چیزی که در این برنامه وجود دارد که من انجام اشتباه.
وقتی که من ضربه را وارد کنید من می خواهم برای دریافت هر نوع از فریاد به من؟
چه هستم من برای رفتن به فریاد می زدند: در حدود؟
آره، من را فراموش کرده نمونه، بنابراین من با استفاده از یک تابع سیگما در خط 15 به نام،
اما آن را تا خط 22 اعلام کرد، بنابراین من بهترین فعالانه اینجا
و اعلام یک نمونه، و من از نوع int سیگما (شماره هوشمند) می گویند، و این از آن است.
در پایین اجرا شده است.
>> و یا یکی دیگر از راه من می توانم این را حل کند،
من می توانم از تابع کردن وجود دارد حرکت می کند، که بد نیست،
اما حداقل وقتی که برنامه های خود را شروع به گرفتن طولانی، رک و پوست کنده،
من فکر می کنم برخی از ارزش در همواره با داشتن اصلی در بالای صفحه وجود دارد
به طوری که شما در خواننده می تواند فایل ها و باز کردن سپس بلافاصله بعد از دیدن
آنچه که این برنامه انجام شده است بدون نیاز به جستجو از طریق آن
به دنبال که برای تابع اصلی است.
اجازه دهید به پایین به پنجره ترمینال من در اینجا، سعی کنید ساخت سیگما را سیگما،
و من پیچ تا اینجا بیش از حد.
اعلامیه ضمنی از GetInt تابع یعنی من به چه چیز دیگری را فراموش کرده ام؟
[نامفهوم دانشجو]
خوب است، پس ظاهرا اشتباه رایج است، به طوری که قرار دادن این تا اینجا،
cs50.h، و در حال حاضر بازگشت به پنجره ترمینال من.
>> من روی صفحه نمایش، روشن و من تکرار را سیگما.
به نظر می رسد را کامپایل کرده اند. اجازه دهید من در حال حاضر سیگما را اجرا کنید.
من در عدد 3 را تایپ کنید، و من 6، بنابراین چک دقیق نیست،
اما حداقل این کار در نگاه اول به نظر می رسد، اما حالا آن را قادر به rip کردن از هم جدا،
و اجازه دهید در واقع اهرم ایده از بازگشت، دوباره،
در یک زمینه بسیار ساده است به طوری که در چند هفته
زمانی که ما شروع به کاوش ساختارهای داده خیال باف از آرایه
یکی دیگر از ابزار در جعبه ابزار که با آن به
دستکاری آن ساختارهای داده همانطور که خواهیم دید.
این رویکرد تکرار شونده، رویکرد مبتنی بر حلقه است.
>> اجازه بدهید من به جای آن در حال حاضر انجام این کار است.
اجازه بدهید من به جای می گویند که جمع تعداد
را به 0 است واقعا همان چیزی
شماره + سیگما (تعداد - 1).
به عبارت دیگر، درست مثل روی صحنه، من به هر یک از افراد در کنار به من punted
و آنها به نوبه خود نگه داشته punting تا زمانی که ما در نهایت در ویلی کف،
که مجبور به بازگشت به جواب سخت رمزی مانند 0.
در اینجا در حال حاضر ما در حال به همین ترتیب به سیگما punting
همان تابع در اصل نامیده می شد، اما کلیدی بینش در اینجا
این است که ما در حال سیگما خواستار یکسان است.
ما در N عبور نمی کند.
ما به وضوح در عبور شماره - 1،
بنابراین یک مشکل کمی کوچکتر، کمی کوچکتر مشکل.
>> متاسفانه، این کاملا یک راه حل است هنوز رتبهدهی نشده است، و قبل از حل کنیم
آنچه که ممکن است بیرون پریدن همانطور که آشکار است در برخی از شما
به من اجازه رفتن به جلو و عمل را.
به نظر می رسد به کامپایل درست است.
اجازه دهید از سیگما با 6 عمل من.
اوه، اجازه دهید سیگما با 6 عمل من است.
ما دیده ایم قبل از این، البته زمان به طور تصادفی آخرین نیز هست.
چرا این تقسیم بندی گسل مرموز را دریافت کنم؟ آره.
[نامفهوم دانشجو]
هیچ موردی پایه وجود دارد، و به طور خاص تر، آنچه احتمالا رخ داده است؟
این یک نشانه از چه رفتار است؟
بگو از آن کمی بلندتر است.
[نامفهوم دانشجو]
این حلقه بی نهایت به طور موثر، و مشکل با حلقه های نامتناهی
زمانی که آنها شامل بازگشت در این مورد، یک تابع خود را فراخوانی،
هر بار که شما به یک تابع چه اتفاقی می افتد؟
خوب، فکر می کنم به چگونه ما گذاشته شده از حافظه در کامپیوتر است.
ما گفت که این تکه از حافظه به نام پشته است که در پایین وجود دارد،
و هر بار که شما به یک تابع کمی بیشتر حافظه قرار داده می شود
در این پشته به اصطلاح حاوی متغیرهای محلی آن تابع یا پارامترهای،
بنابراین اگر سیگما خواستار تماس سیگما سیگما سیگما می نامد
می نامد سیگما که آیا این پایان داستان است؟
>> خوب، آن را در نهایت سرریز کل مبلغ
از حافظه است که شما را به کامپیوتر شما.
بخش است که شما قرار است به ماندن در درون تاخت و تاز شما،
و شما این گسل تقسیم بندی، هسته ریخته،
و چه هسته ریخته به معنی این است که من در حال حاضر یک فایل به نام هسته
که یک فایل حاوی صفر و آنهایی که
که در واقع در آینده خواهد بود diagnostically مفید است.
اگر آن را به شما واضح نیست که در آن اشکال شما
شما در واقع می تواند یک کمی تجزیه و تحلیل پزشکی قانونی، پس به صحبت می کنند،
در هسته این فایل روگرفت، که، دوباره، فقط یک دسته از صفر و آنهایی که
که در اصل نشان دهنده حالت برنامه شما در حافظه
لحظه ای که آن را در این راه سقوط کرد.
>> ثابت در اینجا این است که ما فقط نمی تواند کورکورانه بازگشت سیگما،
شماره + سیگما از یک مشکل کمی کوچکتر است.
ما باید به برخی از نوع مورد پایه در اینجا،
و آنچه که باید در مورد پایه احتمالا؟
[نامفهوم دانشجو]
خوب، تا زمانی که تعداد مثبت است ما در واقع باید از این بازگشت،
یا به عبارت دیگر، اگر شماره است، می گویند، <= تا 0،
می دانید، من میام جلو و بازگشت 0،
بسیار شبیه به ویلی انجام داد، و دیگری، من قصد دارم به جلو بروید
و بازگشت، پس از آن است که بسیار کوتاه تر نیست
نسبت به نسخه های تکراری که ما میل تا برای اولین بار با استفاده از یک حلقه،
اما توجه کنید که این نوع از ظرافت به آن وجود دارد.
به جای بازگشت به برخی از شماره ها و انجام تمام این ریاضیات
و اضافه کردن همه چیز را با متغیرهای محلی
به جای آن شما گفت: "خوب، در صورتی که این یک مشکل فوق العاده آسان،
مانند شماره <0 است، به من اجازه برگرداندن 0.
>> ما قصد داریم به زحمت حمایت از اعداد منفی،
بنابراین من قصد دارم به کد سخت ارزش از 0.
اما در غیر این صورت، به پیاده سازی این ایده از جمع
همه از این اعداد با هم شما به طور موثر می تواند نیش کوچک
از این مشکل، بسیار شبیه به ما در اینجا بر روی صحنه بود،
سپس میفرستتون بقیه مشکل را به شخصی که در کنار،
اما در این مورد شخصی که در کنار خود می باشد.
این تابع با نام یکسان است.
فقط آن را تصویب یک مشکل کوچک و کوچکتر و کوچکتر در هر زمان،
و حتی اگر ما هم نه کاملا رسمی در کد
این دقیقا همان چیزی است که قرار بود در هفته 0 با دفترچه تلفن است.
این دقیقا همان چیزی است که قرار بود در هفته گذشته با شان
و با تظاهرات خود را از جستجو برای شماره.
این یک مشکل و تقسیم آن را دوباره و دوباره.
>> به عبارت دیگر، یک راه وجود دارد در حال حاضر ترجمه
این ساختار دنیای واقعی، این ساختار سطح بالاتر
از تقسیم و حل و انجام کاری دوباره و دوباره
در کد، به طوری که این چیزی است که ما دوباره را در طول زمان است.
در حال حاضر، به عنوان به کنار، اگر شما جدید به بازگشتی حداقل در حال حاضر باید درک
چرا این خنده دار است.
من قصد دارم برای رفتن به google.com،
و من قصد دارم برای برخی از راهنمایی و جواب در مورد بازگشت را جستجو کنید، را وارد کنید.
به شخصی که در کنار به شما اگر آنها خنده نه تنها در حال حاضر است.
آیا بازگشت شما چیست؟
آیا منظورتان این بود آه، وجود دارد بروید.
خوب، در حال حاضر که بقیه از همه است.
کمی تخم مرغ عید پاک در جایی وجود دارد در گوگل تعبیه شده است.
به عنوان یک کنار، یکی از لینک ما در وب سایت درس قرار داده است
امروز فقط این شبکه از الگوریتم های مرتب سازی های مختلف،
که برخی از آنها، ما در هفته گذشته نگاه کرد، اما آنچه خوب است در مورد این تجسم
به عنوان شما سعی می کنید برای قرار دادن ذهن خود را در اطراف چیزهای مختلف مربوط به الگوریتم
می دانم که شما به راحتی می توانید در حال حاضر با انواع مختلفی از ورودی شروع.
ورودی معکوس، عمدتا ورودی مرتب شده باشد، ورودی های تصادفی و غیره.
همانطور که شما، دوباره سعی کنید، تشخیص این چیزها را در ذهن خود مرور کنید
متوجه باشید که این URL را در وب سایت درس در صفحه سخنرانی
ممکن است به شما کمک کند و دلیل را از طریق برخی از آن.
>> امروز ما در نهایت این مشکل را حل کند در حالی که به عقب،
که بود که این تابع swap درست کار نمی کند،
و آنچه که مشکل اساسی با این مبادله عملکرد بود.
که هدف از آن بود، باز هم، به تبادل یک مقدار اینجا و اینجا
به طوری که این اتفاق می افتد؟
این واقعا کار می کنند. چرا؟
آره.
[نامفهوم دانشجو]
دقیقا توضیح برای این bugginess
به سادگی بود چرا که وقتی با شما تماس توابع در C
و آن دسته از توابع را استدلال، مانند A و B در اینجا،
شما در حال عبور در نسخه از هر ارزش شما در حال ارائه به آن تابع است.
شما ارائه ارزش های اصلی خود،
بنابراین ما این کار را در چهار چوب از buggyc را دیدم،
buggy3.c، که نگاه چیزی کمی مانند این.
>> به یاد بیاورید که ما تا به حال x و y به 1 و 2 مقداردهی اولیه، به ترتیب.
ما پس از چاپ چه بودند.
من پس از آن ادعا کرد که من آنها را مبادله خواستار مبادله X، Y.
اما مشکل این بود که مبادله کار می کرد،
اما تنها در حوزه مبادله به خودی خود عمل می کنند.
به محض این که ما ضربه خط 40 آن ارزش تعویض
دور انداخته بودند، و بنابراین هیچ چیز
در تابع اصلی اصلی تغییر در واقع در همه،
بنابراین اگر شما فکر می کنم پس از آن به عنوان به آنچه که این به نظر می رسد در شرایط استفاده از حافظه ما
در صورتی که این سمت دست چپ از هیئت مدیره نشان دهنده
و من بهترین من برای همه برای دیدن این اگر این سمت دست چپ از هیئت مدیره
نشان دهنده، می گویند، RAM خود را، و پشته به رشد در این راه،
و ما به یک تابع مانند اصلی است، و اصلی دارای 2 متغیرهای محلی، x و y،
اجازه دهید در توصیف کسانی که به عنوان X در اینجا، و اجازه دهید به توصیف این عنوان Y،
و اجازه دهید در مقادیر 1 و 2 قرار داده است، بنابراین در اینجا این است اصلی،
و هنگامی که اصلی فراخوانی تابع swap سیستم عامل
می دهد تابع مبادله باریک خود را از حافظه در پشته،
قاب خود را در پشته، پس به صحبت می کنند.
همچنین تخصیص 32 بیت برای این نوع داده int است.
این اتفاق می افتد آنها را به A و B است، اما کاملا خودسرانه است.
این می تواند آنها را به نام هر چه آن را می خواهد، اما چه اتفاقی می افتد وقتی که اصلی
مبادله تماس است که طول می کشد این 1 قرار می دهد، یک کپی وجود دارد قرار می دهد، یک کپی وجود دارد.
>> 1 نفر دیگر از متغیر های محلی در مبادله وجود دارد، هر چند، به نام چه؟ TMP >>.
tmp را دارد، بنابراین اجازه دهید من خودم 32 بیت دیگر در اینجا،
و چه من در این تابع انجام می دهید؟
من گفت: TMP نوع int می شود، بنابراین دارای 1، بنابراین من این زمانی که ما در گذشته با این مثال ایفا کرده است.
می شود B، بنابراین B ​​2 است، بنابراین در حال حاضر این می شود 2،
و در حال حاضر ب می شود موقت است، به طوری موقت است: 1.
بنابراین در حال حاضر ب این می شود.
که بزرگ است. این کار کرده است.
اما پس از آن تا به زودی به عنوان بازده عملکرد
حافظه مبادله به طور موثر از بین می رود به طوری که می توان آن را مورد استفاده مجدد قرار
برخی از عملکرد های دیگر در آینده، اصلی و واضح است که به طور کامل بدون تغییر است.
ما نیاز به یک راه اساسا حل این مشکل،
و امروز ما در نهایت باید راه را برای انجام این کار به موجب آن
ما می توانیم چیزی به نام اشاره گر معرفی نماید.
به نظر می رسد که ما می توانیم این مشکل را حل کند
نه در نسخه های X و Y عبور
اما به جای عبور در آنچه، آیا شما فکر می کنید، به تابع swap؟
آره، چه در مورد آدرس؟
ما در مورد آدرس ها واقعا نه در جزئیات بسیار صحبت کردیم،
اما در صورتی که این تخته سیاه نشان دهنده حافظه کامپیوتر من است
ما قطعا می تواند شماره بایت RAM من
و می گویند این است که BYTE # 1، BYTE # 2 بایت # 3
BYTE # 4 BYTE # ... 2 میلیارد اگر من 2 گیگابایت RAM،
بنابراین ما قطعا می تواند با برخی از طرح شماره خودسرانه است
برای تمام بایت های فردی در حافظه کامپیوتر من.
>> چه می شود اگر به جای زمانی که من اسمش مبادله
به جای رفتن به نسخه های X و Y
چرا من نمی توانم به جای آن در آدرس x را در اینجا عبور،
آدرس Y در اینجا، اساسا آدرس پستی
x و y به دلیل مبادله اگر او مطلع
آدرس در حافظه X و Y،
پس از آن، مبادله اگر ما آموزش داده او کمی،
او به طور بالقوه می تواند به آن آدرس رانندگی، پس به صحبت می کنند،
x، و تغییر تعداد وجود دارد، پس از آن به آدرس Y رانندگی،
تغییر شماره وجود دارد، حتی در حالی که در واقع گرفتن کپی از آن ارزش خود را،
بنابراین حتی اگر ما در این مورد به عنوان حافظه اصلی صحبت کردیم
حافظه و این مبادله به عنوان قدرتمند و خطرناک C
این است که هر تابع می تواند حافظه در هر نقطه از کامپیوتر لمس،
و این قدرتمند است که شما می توانید چیزهای بسیار فانتزی را با برنامه های کامپیوتری در C.
این خطرناک است، زیرا شما همچنین می توانید پیچ ​​به راحتی.
در واقع، یکی از رایج ترین راه برای برنامه های این روز به بهره برداری می شود
هنوز هم برای یک برنامه نویس به درک
که او اجازه می دهد داده ها
می شود در یک محل در حافظه است که در نظر گرفته شده بود نوشته شده است.
>> به عنوان مثال، او اعلام کرد که مجموعه ای از اندازه 10
اما بعد از آن به طور تصادفی تلاش می کند برای قرار دادن 11 کلمه در ادامه متن به آن آرایه ای از حافظه،
و شما شروع به دست زدن به بخش هایی از حافظه هستند که دیگر معتبر نیست.
فقط به متنی این، برخی از شما ممکن است بدانید که
نرم افزار اغلب به شما دهید برای شماره سریال یا کلید های ثبت نام،
فتوشاپ و ورد و برنامه های شبیه به این.
وجود دارد ترک وجود دارد، در حالی که بعضی از شما می دانید، آنلاین که در آن شما می توانید یک برنامه کوچک اجرا شود،
و voila، بدون درخواست شماره سریال.
چگونه است که کار می کنید؟
در بسیاری از موارد، این چیزها را به سادگی در کامپیوتر پیدا کردن
بخش متن صفر و آنهایی که واقعی کامپیوتر
که در آن تابع است که شماره سریال این است که در آن درخواست،
و که فضای شما را بازنویسی، و یا در حالی که برنامه در حال اجرا است
شما می توانید از شکل که در آن کلید است که در واقع ذخیره شده
با استفاده از چیزی به نام یک دیباگر، و شما می توانید نرم افزار را که راه را ترک.
این است که می گویند این است که هدف ما در چند روز آینده،
اما آن را دارای پیامدهای بسیار واقعی جهان است.
که اتفاق می افتد را درگیر سرقت از نرم افزار،
اما همچنین از ماشین آلات تمام مصالحه وجود دارد.
>> در واقع، هنگامی که وب سایت این روزها مورد سوء استفاده قرار گیرد
در معرض خطر قرار داده است و به بیرون درز شده و کلمه عبور به سرقت رفته است
این امر اغلب مربوط به مدیریت ضعیف از حافظه است،
و یا در مورد پایگاه های داده، عدم پیش بینی
ورودی خصمانه است، به طوری که در هفته آینده،
اما در حال حاضر فقط یک پیش نمایش دزدکی حرکت کردن از نوع آسیب است که شما می توانید انجام دهید
کاملا درک چیزهایی زیر هود کار می کنند.
بیایید در مورد درک اینکه چرا این خراب است
با یک ابزار است که تبدیل خواهد شد و بیشتر و بیشتر مفید
به عنوان برنامه های ما را دریافت کنید پیچیده تر است.
تا کنون هنگامی که شما تا به حال یک اشکال در برنامه های شما
چگونه شما در مورد اشکال زدایی آن رفته است؟
چه تکنیک های تان بوده است و تا کنون، چه TF شما آموزش داده
یا فقط خود تدریس می شود؟
[دانشجو] Printf.
Printf، بنابراین printf احتمالا دوست شما در آن بوده است اگر شما می خواهید برای دیدن
چه خبر است در داخل برنامه شما
شما فقط با قرار دادن printf اینجا، printf، printf در اینجا.
سپس آن را اجرا می کنید، و شما یک دسته از مسائل را بر روی صفحه نمایش
که شما می توانید استفاده کنید تا پس از آن استنباط است که در واقع اشتباه در برنامه شما است.
>> Printf گرایش به چیزی بسیار قدرتمند،
اما این روند بسیار کتابچه راهنمای کاربر.
شما باید برای قرار دادن printf، printf اینجا،
و اگر شما آن را قرار داده و داخل یک حلقه شما ممکن است از 100 خط
خروجی که بعد از آن شما باید به غربال کردن از طریق.
این مکانیسم بسیار کاربر پسند و تعاملی برای اشکال زدایی برنامه نیست،
اما خوشبختانه وجود دارد، جایگزین شده است.
یک برنامه، به عنوان مثال، به نام GDB اشکالزدا GNU وجود دارد،
که پیچیده کمی در چگونگی استفاده از آن است.
کمی پیچیده است، اما رک و پوست کنده،
این یکی از آن چیزهایی است که اگر شما در این هفته قرار داده است و در کنار است
ساعت اضافی به درک چیزی شبیه GDB
آن را به شما احتمالا ده ها ساعت صرفه جویی در دراز مدت،
بنابراین با آن، اجازه دهید من به شما یک تیزر از این چیز چگونه کار می کند را به من بدهید.
>> من در پنجره ترمینال من هستم.
اجازه بدهید من بروم جلو و تدوین این برنامه، buggy3.
در حال حاضر تا به امروز است.
اجازه بدهید من آن را اجرا کنید درست مثل ما پشت در حالی که، و در واقع، آن را شکسته.
اما چرا؟ شاید من پیچ تابع swap.
شاید آن A و B است. من کاملا آنها را در حال حرکت در اطراف صحیح می باشد.
اجازه بدهید من به جلو بروید و این کار.
به جای، فقط buggy3 اجرا اجازه دهید من به جای اجرای این برنامه GDB،
و من قصد دارم به آن بگویم برای اجرای buggy3،
و من قصد دارم که شامل یک آرگومان خط فرمان، TUI،
و ما این کار را در مسائل آینده در تنظیمات به یادآوری قرار داده است.
و در حال حاضر این رابط سیاه و سفید ظهور تا که، باز هم،
کمی قریب به اتفاق در ابتدا به این دلیل که همه این کار وجود دارد
اطلاعات مربوط به ضمانت نامه را در اینجا، اما حداقل چیزی آشنا وجود دارد.
در بالای پنجره کد واقعی من
و اگر من رفته تا در اینجا اجازه دهید من به خیلی از فایل بالا رفته،
و در واقع، buggy3.c، و توجه وجود دارد در پایین این پنجره
من این مهلت GDB.
>> این همان طبیعی من جان هاروارد اعلان نمی باشد.
این یک اعلان که به من اجازه می دهد تا کنترل GDB است.
GDB دیباگر است.
دیباگر برنامه ای است که به شما اجازه می دهد که از طریق راه رفتن
اجرای خط برنامه خود را خط به خط،
در طول راه از انجام هر کاری شما به برنامه می خواهم،
حتی فراخوانی توابع، و یا به دنبال مهمتر از آن،
در مقادیر متغیر های مختلف.
اجازه دهید به جلو بروید و این کار.
من قصد دارم به پیش بروید و نوع اجرا در سریع GDB،
بنابراین متوجه در پایین و سمت چپ صفحه نمایش من تایپ اجرا،
و من ضربه را وارد کنید، و آنچه که انجام داد؟
آن را به معنای واقعی کلمه فرار برنامه من است، اما من واقعا نمی بینید در اینجا
چون من در واقع نه به اشکال زدا گفت:
را به توقف در لحظه ای خاص در زمان است.
فقط تایپ کردن برنامه را اجرا می کند.
من واقعا نمی توانم چیزی ببینم. من می توانم آن را دستکاری نیست.
>> به جای من این کار را کنیم.
در این اعلان GDB اجازه دهید من به جای تایپ شکستن، وارد کنید.
این چیزی است که من به معنای به تایپ نیست.
بیایید به جای اصلی تایپ استراحت.
به عبارت دیگر، من می خواهم به تنظیم چیزی به نام نقطه انفصال،
است که به درستی نام به خاطر آن خواهد شکست و یا توقف
اجرای برنامه های خود را در آن محل خاص است.
اصلی نام تابع من است.
توجه کنید که GDB بسیار هوشمند است.
نمیفهمد که اصلی اتفاق می افتد برای شروع تقریبا در خط 18
از buggy3.c، و پس از آن در اینجا در بالا سمت چپ متوجه
B + است درست در کنار خط 18.
که به من یادآوری که من آن را نقطه انفصال را در خط 18.
این بار وقتی که من نوع اجرا، من قصد دارم برای اجرای برنامه های من
تا از آن بازدید می کند که نقطه انفصال،
بنابراین این برنامه را برای مکث من در خط 18.
در اینجا ما اجرا شود.
هیچ چیز به نظر می رسد که اتفاق افتاده است، اما اطلاع در پایین سمت چپ
با شروع برنامه، buggy3، نقطه انفصال 1 اصلی در خط buggy3.c 18.
در حال حاضر چه کاری می توانم انجام دهم؟
>> توجه داشته باشید که می توانید شروع به تایپ کردن چیزهایی مانند چاپ،
نه printf، X چاپ، و در حال حاضر که عجیب است.
$ 1 است فقط یک کنجکاوی، خواهیم دید
هر زمان که شما نسخه قابل چاپ چیزی شما می توانید جدید دلار ارزش است.
که به طوری که شما می توانید اشاره به ارزش های قبلی فقط در مورد،
اما در حال حاضر آنچه چاپ شده است به من گفتن این است که ارزش از X در این نقطه در داستان
ظاهرا 134،514،032.
چیست؟ کجا که حتی آمده است؟
[نامفهوم دانشجو]
در واقع، این چیزی است که ما می خواهیم یک مقدار زباله تماس بگیرید، و ما در این مورد صحبت نمی
اما به این دلیل که متغیرهای مقداردهی اولیه شما
بدیهی است به طوری که آنها برخی از ارزش است که شما می خواهید آنها را به.
اما گرفتن یاد داشته باشید که شما می توانید متغیر را اعلام
مثل من لحظه ای پیش در مثال سیگما من
در واقع بدون دادن آنها یک ارزش است.
به یاد بیاورید آنچه که من در اینجا در سیگما است.
من اعلام N، اما چه مقدار آن را به من بدهد؟
هیچ، چرا که من می دانستم که در چند خط بعدی
GetInt مراقبت از مشکل قرار دادن یک مقدار در داخل از n است.
>> اما در این نقطه در داستان خط 11
و 12 خط و خط 13 و خط 14
در طول این چند خط چه مقدار N؟
در C شما فقط نمی دانم.
به طور کلی برخی از ارزش زباله، برخی از شماره های کاملا تصادفی
که اساسا از برخی از عملکرد های قبلی باقی مانده
پس از اجرا، به طوری به عنوان برنامه خود را اجرا می کند
به یاد آورید که تابع می شود تابع، تابع، تابع.
همه این قاب را بر روی حافظه قرار داده است، و پس از آن کسانی که بازگشت توابع،
و درست مثل من با پاککن حافظه آنها است که در نهایت مورد استفاده مجدد قرار پیشنهاد شده است.
خب، این خیلی اتفاق می افتد که این متغیر x استفاده در این برنامه
به نظر می رسد که شامل برخی از ارزش زباله مانند 134514032
از برخی از عملکرد های قبلی، نه که من نوشتم.
این می تواند چیزی است که می آید به طور موثر با سیستم عامل،
برخی از عملکرد های زیر هود.
>> بسیار خوب، بسیار خوب، اما اجازه دهید در حال حاضر پیشرفت به خط بعدی.
اگر من در GDB من سریع تایپ کنید "بعدی" و من ضربه را وارد کنید،
توجه کنید که برجسته حرکت به پایین به خط 19،
اما مفهوم منطقی این است که خط 18 است
در حال حاضر به پایان رسید اجرای، بنابراین اگر من دوباره تایپ کنید "چاپ اکس"
من در حال حاضر باید 1، دیدن و در واقع، من.
باز هم، این مسائل راه از GDB شما یادآوری است
آنچه را که تاریخ چاپ هستند که شما انجام داده ام.
حالا من به جلو بروید و اجازه چاپ کردن Y، و در واقع، y است برخی از ارزش های دیوانه را به عنوان،
اما هیچ معامله بزرگ به دلیل در خط 19 ما را به آن اختصاص دهید
مقدار 2، "بعدی" را تایپ دوباره به من اجازه دهید.
و در حال حاضر ما در خط printf هستیم.
به من اجازه انجام X نسخه قابل چاپ.
به من اجازه انجام Y چاپ. صادقانه بگویم، من کمی از چاپ این خسته است.
اجازه بدهید من به جای تایپ "X نمایش" و "نمایش Y،
و حالا هر بار که من تایپ یک فرمان در آینده
من خواهد بود از آنچه یاد آوری x و y، چه x و y، x و y است.
>> من همچنین می تواند به عنوان یک کنار، نوع در "اطلاعات مردم محلی است."
اطلاعات یک فرمان خاص می باشد.
مردم محلی به معنی آن را به من نشان می دهد متغیرهای محلی است.
فقط در مورد من فراموش کرده ام و یا این است که یک تابع پیچیده و دیوانه،
که من و یا شخص دیگری نوشت: مردم محلی اطلاعات را به شما بگویم
همه متغیرهای محلی در داخل این تابع محلی
که شما ممکن است در مورد اگر شما می خواهید را به بهم زدن در اطراف مراقبت.
در حال حاضر، printf در مورد به اجرا است، بنابراین اجازه دهید من به جلو بروید و فقط از نوع "بعدی".
از آنجا که ما در این محیط هستید ما در واقع نه آن را دیدن
اجرا پایین در اینجا، اما متوجه آن کمی لت و پار اینجا.
اما توجه کنید که آن را برجسته روی صفحه نمایش وجود دارد.
پس از آن یک برنامه کامل در اینجا نیست، اما اشکالی ندارد، زیرا من همیشه می توانید فشار با نوک انگشت اطراف
با استفاده از چاپ اگر من می خواهم.
>> اجازه بدهید نوع بعد دوباره است، و در حال حاضر در اینجا قسمت جالب است.
در این نقطه در داستان Y 2 است، و X 1 است،
به عنوان پیشنهاد در اینجا، و دوباره،
دلیل این است که به طور خودکار به نمایش در حال حاضر است به خاطر من با استفاده از دستور
نمایش X و Y نمایش، به طوری که لحظه ای من نوع بعد
در نظریه X و Y باید تعویض شود.
در حال حاضر، ما در حال حاضر می دانم که نمی خواهید به صورت،
اما ما را در یک لحظه ببینید که چگونه ما می توانیم به شیرجه رفتن عمیق تر برای کشف کردن چرا که درست است.
بعدی، و متاسفانه، y است که هنوز هم 2 و X است که هنوز 1، و من به همان اندازه می تواند تایید کند.
نسخه قابل چاپ X، Y چاپ.
در واقع، هیچ مبادله در واقع رخ داده است، به طوری که اجازه شروع این بیش از حد.
واضح است که مبادله خراب است.
اجازه دهید به جای تایپ دوباره "اجرای".
اجازه دهید به من می گویند بله، من می خواهم به آن را از ابتدا راه اندازی مجدد، آن را وارد کنید.
>> در حال حاضر من در خط 18.
در حال حاضر x و y مقادیر زباله دوباره اطلاع می دهد.
بعد، بعد، بعد، بعد.
اگر من خسته شدم من هم فقط می توانید نفر برای ورود وارد کنید.
شما می توانید آن را به دنباله کوتاهترین زمان ممکن از شخصیت های مختصر.
تعویض در حال حاضر خراب شده است.
بیایید شیرجه، بنابراین به جای تایپ کردن بعدی،
حالا من قصد دارم به نوع گام به طوری که من پله در داخل این تابع
به طوری که من می توانید از طریق آن راه برود، تا من ضربه گام و پس از آن را وارد کنید.
توجه کنید که پایین میپرد برجسته در برنامه های من پایین تر به خط 36.
در حال حاضر آنچه متغیرهای محلی هستند؟
مردم محلی اطلاعات.
هیچ چیز درست نشده است چرا که ما کرده ایم که به خط نیست و بعد فورا رفت واز،
پس جلو بروید و می گویند اجازه دهید "بعدی".
در حال حاضر ما به نظر می رسد به TMP، TMP چاپ.
ارزش زباله، درست است؟ من فکر می کنم تا.
چگونه در مورد چاپ، چاپ ب، 1 و 2؟
در یک لحظه، به محض این که من نوع بعد دوباره
TMP است که رفتن به ارزش، از مجموع 1، امیدوارم،
زیرا TMP است به مقدار یک را اختصاص داده است.
>> حال حاضر اجازه دهید چاپ A، B، چاپ،
اما در حال حاضر TMP، چاپ و در واقع 1.
به من اجازه انجام بعدی. به من اجازه انجام بعدی.
تابع swap من به پایان رسید.
من هنوز در داخل از آن در خط 40، به طوری که اجازه چاپ به من،
چاپ، B و من اهمیتی نمی دهند چه TMP است.
به نظر می رسد مبادله درست است که آن را به مبادله A و B می آید.
اما اگر من در حال حاضر نوع بعد، من پرش به خط 25،
و البته، اگر من در X و Y چاپ نوع
آنها هنوز هم تغییری نکرده است، بنابراین ما باید این مشکل ثابت نیست.
اما diagnostically در حال حاضر شاید با این برنامه GDB
ما که حداقل بدست یک قدم نزدیک تر به درک
چه چیزی اشتباه است و بدون نیاز به بستر کد خود را با قرار دادن printf،
printf در اینجا، printf و سپس آن را دوباره و دوباره در حال اجرا
تلاش برای کشف کردن آنچه اشتباه رفتن.
>> من قصد دارم به جلو بروید و ترک کنید از این در مجموع با ترک.
این به آن می گویند "حال ترک میکنید؟" بله.
حالا من پشت در سریع طبیعی من، و من با استفاده از GDB.
تا به کنار، شما لازم نیست برای استفاده از این TUI پرچم.
در واقع، اگر شما آن را حذف شما می توانید اصل نیمه پایین صفحه نمایش است.
اگر من پس از آن استراحت اصلی تایپ کنید و پس از آن اجرا
من هنوز هم می توانید برنامه، اجرا، اما آنچه آن را انجام خواهد داد این است که بیشتر متنی
فقط به من نشان می دهد که یک خط در حال حاضر در یک زمان.
TUI، رابط کاربری متنی،
فقط به شما نشان می دهد که بیشتر از این برنامه در یک بار، که احتمالا یک کمی مفهومی ساده تر است.
اما در واقع، من فقط می تواند بعد، بعد، بعدی،
و من رفتن به یک خط در یک زمان، و اگر من واقعا می خواهم برای دیدن آنچه که در حال رفتن به
من می توانم لیست و نوع دیدن کل یک دسته از خطوط همسایه.
>> یک ویدیو وجود دارد که ما خواسته است که به شما برای تماشا مشکل مجموعه 3
مقابله را پوشش می دهد که در آن برخی از پیچیدگیهای GDB،
و این یکی از آن چیزهایی است، صادقانه، که در آن برخی از درصد غیر بدیهی از شما
GDB لمس هرگز، و خواهد بود که یک چیز بد
چرا که به معنای واقعی کلمه شما به صرف زمان بیشتری را بعد از این ترم به پایان خواهد رسید
تعقیب پایین اشکالات و سپس شما می توانید اگر شما که در نیم ساعت / ساعت قرار داده است
این هفته و یادگیری های بعدی برای به دست آوردن راحت با GDB.
Printf دوست شما.
GDB در حال حاضر باید دوست شما باشد.
>> هر گونه سوال در GDB؟
و در اینجا یک لیست سریع از برخی از دستورات قدرتمند ترین و مفید است.
آره. >> می توانید یک رشته شما نسخه قابل چاپ؟
می توانید یک رشته شما نسخه قابل چاپ؟ قطعا.
این را ندارد فقط به اعداد صحیح است.
اگر یک ثانیه متغیر فقط در S چاپ یک رشته است.
این شما را به آنچه که متغیر رشته ای است نشان می دهد.
[نامفهوم دانشجو]
آن را به شما آدرس و رشته خود را به من بدهید.
این به شما هر دو را نشان می دهد.
و یک چیز، فقط به خاطر این خوب است که بیش از حد.
Backtrace و قاب، اجازه دهید من به این زمان یکی از آخرین شیرجه،
همان برنامه ای دقیق با GDB.
اجازه بدهید من به جلو بروید و آن را اجرا رابط کاربر نسخه متنی،
شکستن اصلی.
اجازه بدهید من به جلو و دوباره اجرا کنید. من اینجا هستم.
حالا من به بعد، بعد، بعد، بعد، بعدی، گام، وارد کنید.
>> و حالا فرض کنید که من در حال حاضر در مبادله عمدا، اما من می خواهم هستم "لعنتی، چه مقدار x؟"
من می توانم X را ندارد.
من می توانم Y انجام این کار نمی کند چرا که آنها در محدوده نیستید.
آنها در زمینه هستید، اما مشکلی ندارد.
من می توانم backtrace تایپ کنید.
که نشان می دهد به من همه از توابع است که تا این نقطه در زمان اجرا.
توجه داشته باشید که یکی از در پایین، اصلی، خطوط اصلی
که در پایین تصویر ما در اینجا.
واقعیت این است که مبادله در بالای آن خطوط با مبادله بالای آن در حافظه در اینجا،
و اگر من می خواهم به برگشت به بخش اصلی به طور موقت می توان گفت: "قاب".
چه تعداد؟ صفحه اصلی قاب # 1 است.
من قصد دارم به جلو بروید و می گویند: "قاب 1".
>> حالا من پشت در اصلی، و من می توانم X نسخه قابل چاپ، و من می توانم Y چاپ،
اما من می توانم A، B یا نسخه قابل چاپ نیست.
اما من می توانم اگر من می گویند، "خوب، یک دقیقه صبر کنید. مبادله کجا بود؟"
اجازه دهید من به جلو بروید و می گویند "0 قاب."
در حال حاضر من به جایی برگردان که در آن من می خواهم به، و به عنوان یک کنار،
دستورات دیگر نیز وجود دارد، مانند اگر شما واقعا بی حوصله تایپ بعدی، بعد، بعد، بعدی،
به طور کلی شما می توانید چیزهایی مانند می گویند: "10 صفحه بعد،" و آن را از طریق 10 خط بعدی قدم.
شما همچنین می توانید "ادامه" زمانی که شما واقعا با پله را از طریق آن تغذیه می نویسم.
ادامه برنامه خود را بدون وقفه اجرا شود، تا زمانی که آن را بازدید یکی دیگر از نقطه انفصال،
چه در یک حلقه و یا پایین تر را در برنامه خود.
>> در این مورد ما به پایان ادامه داد، و برنامه خارج شده به طور معمول.
این راه فانتزی، فرآیند تحتانی است.
فقط برنامه های خود را به طور معمول خارج شده است.
بیشتر در مورد آن در این ویدئو و در اشکال زدایی جلسه آینده.
این زیادی بود.
بیایید 5 دقیقه استراحت ما در اینجا، و ما را با ساختمانها و فایل ها را به شما بر می گردانند.
>> اگر شما به pset این هفته شیرجه در حال حاضر
شما می دانید که ما در کد توزیع استفاده از،
کد منبع است که ما به شما به عنوان یک نقطه شروع، برخی از تکنیک های جدید ارائه.
به طور خاص، ما به معرفی این کلید واژه جدیدی به نام ساختار، ساختار،
به طوری که ما می توانیم متغیرهای سفارشی انواع ایجاد کنید.
ما همچنین به معرفی مفهوم فایل فایل ورودی و خروجی I / O،،
و این است به طوری که ما می توانیم دولت را نجات دهد
هیئت مدیره تقلا خود را به یک فایل بر روی دیسک
به طوری که همراهان آموزش و من می توانم درک
چه خبر است در داخل برنامه های خود را بدون نیاز به صورت دستی بازی
ده ها تن از بازی تقلا.
ما می توانیم این automatedly انجام دهد.
>> این ایده از ساختار حل یک مشکل نسبتا قانع کننده است.
فرض کنید که ما می خواهیم برای اجرای برخی از برنامه های
که به نحوی نگه می دارد ردیابی اطلاعات در مورد دانش آموزان،
و دانش آموزان ممکن است داشته باشد، به عنوان مثال، ID، نام و نام خانوادگی
و یک خانه در یک جایی مثل دانشگاه هاروارد، به طوری که این 3 قطعه از اطلاعات
ما می خواهیم به نگه داشتن اطراف، بنابراین به من اجازه رفتن به جلو و شروع به نوشتن یک برنامه کوچک در اینجا،
عبارتند از: stdio.h.
اجازه دهید من را شامل cs50.h.
و سپس تابع اصلی شروع می شود.
من نمی خواهد زحمت با هر استدلال های خط فرمان،
و در اینجا من می خواهم به یک دانش آموز، بنابراین من قصد دارم برای گفتن
یک دانش آموز دارای یک نام است، بنابراین من قصد دارم برای گفتن "نام رشته."
سپس من قصد دارم برای گفتن یک دانشجو نیز دارای یک ID، ID بنابراین نوع int،
یک دانش آموز یک خانه، بنابراین من هم از رفتن به می گویند "خانه رشته است."
سپس من از این کمی پاک تر سفارش این را میپسندند.
خوب، در حال حاضر من 3 متغیر که با آن برای نشان دادن یک دانش آموز، به طوری که "یک دانش آموز است."
>> و در حال حاضر من می خواهم به جمعیت این مقادیر، پس من به جلو بروید و می گویند چیزی شبیه به شما اجازه می دهد تا
"شناسه = 123.
نام و نام خانوادگی رفتن به دیوید.
بیایید می گویند خانه رفتن به ماتر
و پس از آن من قصد دارم برای انجام کاری خودسرانه مانند printf ("٪ s را،
که ID٪ D، در٪ s را زندگی می کند.
و در حال حاضر، چه چیزی من می خواهم در اینجا به برق وصل کردن، یکی پس از دیگری؟
نام، شماره، خانه، بازگشت از 0.
خوب، مگر اینکه screwed تا جایی در اینجا
من فکر می کنم ما باید یک برنامه خیلی خوب است که ذخیره یک دانش آموز است.
البته، این همه که جالب نیست. چه می شود اگر من می خواهم به 2 دانشجو؟
که هیچ معامله بزرگ است. من می توانم 2 نفر پشتیبانی می کند.
اجازه دهید من به جلو بروید و برجسته و پایین رفتن در اینجا،
و من می توانم بگویم "شناسه = 456" برای کسی مثل راب زندگی می کند که در Kirkland.
>> خوب، صبر کن، اما من می توانید تماس بگیرید این همان چیزی
و به نظر می رسد مثل من قصد دارم برای کپی،
بنابراین اجازه دهید من می گویند که این می شود متغیرهای دیوید،
و اجازه دهید برخی از نسخه های از این من برای راب.
ما می خواهیم از این راب اما این است که قصد ندارم به کار کن
چون من صبر کنید، اجازه دهید به من تغییر به ID1، NAME1 و house1.
راب خواهد بود 2، 2.
من برای تغییر این در اینجا، اینجا، اینجا، اینجا، اینجا، اینجا.
صبر کنید، چه در مورد تامی؟ اجازه دهید این کار را دوباره.
بدیهی است اگر شما هنوز هم فکر می کنم این است که یک راه خوب برای انجام این کار، آن را،
بنابراین کپی / چسباندن بد.
اما ما حل یک هفته پیش.
>> راه حل ما چه بود که ما می خواستیم به چند نمونه از نوع داده های مشابه؟
[دانشجویان] یک آرایه.
آرایه، بنابراین من سعی کنید تا تمیز کنیم.
اجازه دهید برخی از اتاق را برای خودم در بالا را من، و اجازه دهید من به جای انجام این کار در اینجا.
خواهیم این افراد، تماس گرفته و به جای من قصد دارم برای گفتن "شناسه نوع int،
و من قصد دارم به حمایت از 3 از ما در حال حاضر است.
من قصد دارم برای گفتن "نام رشته،" و من 3 از ما پشتیبانی،
و پس از آن من قصد دارم برای گفتن "خانه های رشته ای،" و من قصد دارم به حمایت از 3 از ما.
در حال حاضر در اینجا به جای دیوید گرفتن متغیرهای محلی خود را
ما می توانیم از آن خلاص شدن از شر است.
که احساس خوبی است که ما در حال تمیز کردن این است.
من پس از آن می توانید با دیوید است برای رفتن به [0] و نام ها [0] می گویند
و خانه ها [0].
و پس از آن راب ما به همین ترتیب می تواند در این مورد را نجات دهد.
بیایید این را در اینجا، به طوری که او را برای رفتن به خودسرانه شناسه [1].
او برای رفتن به نام [1]،
و پس از آن در نهایت، خانه ها [1].
>> هنوز کمی خسته کننده است، و در حال حاضر من به شکل از این،
بنابراین اجازه دهید می گویند "نام [0] ID [0] خانه [0]
و اجازه جمع این.
شناسه، شناسه، شناسه.
و دوباره، من آن را انجام می دهند، تا دوباره، من در حال حاضر با توسل به کپی / چسباندن دوباره،
بنابراین شانس هستند یکی دیگر از راه حل اینجا وجود دارد.
من احتمالا می تواند تا بیشتر تمیز با یک حلقه و یا چیزی شبیه به آن،
بنابراین در کوتاه مدت، آن را کمی بهتر است اما هنوز هم احساس می کند مانند
من با توسل به کپی / چسباندن، اما حتی این، من ادعا می کنند،
واقعا اساسا راه حل مناسب به دلیل
چه می شد اگر گاهی اوقات ما تصمیم می گیرید شما می دانید چه؟
ما واقعا باید ذخیره سازی آدرس ایمیل دیوید و راب
و هر کس دیگری در این برنامه است.
ما نیز باید شماره تلفن را ذخیره می کند.
ما همچنین باید شماره های تماس اضطراری ذخیره می نماید.
در حال حاضر تمام این قطعه از داده هایی را که می خواهید برای ذخیره،
پس چگونه می توانم شما را در مورد انجام این کار بروید؟
>> شما اعلام یکی دیگر از مجموعه ای در بالا، و سپس شما را به صورت دستی اضافه کنید
آدرس پست الکترونیک [0]، آدرس پست الکترونیک [1]
دیوید و راب و غیره.
اما واقعا فقط یک فرض اساسی این طرح وجود دارد
که من با استفاده از سیستم افتخار می دانیم که
[من] در هر یک از آرایه های مختلف
خیلی اتفاق می افتد برای اشاره به همان شخص است،
پس [0] در شناسه، شماره 123،
و من قصد دارم به فرض که نام ها [0]
نام همان شخص و خانه ها [0]
خانه همان شخص و غیره همه از آرایه های مختلف که من ایجاد شده است.
اما توجه کنید که هیچ پیوندی اساسی وجود دارد
در میان کسانی که 3 قطعه از اطلاعات، شناسه، نام و خانه،
حتی اگر نهاد ما سعی می کنیم مدل در این برنامه آرایه نیست.
آرایه ها فقط این راه برنامه ریزی برای انجام این کار است.
چیزی که ما واقعا می خواهید به مدل در برنامه ما یک فرد است
مانند دیوید، یک نفر مثل راب در داخل از آن
یا کپسوله سازی نام و ID و خانه است.
>> آیا می توانیم به نحوی بیان این ایده را از یگدیگر
به موجب آن یک فرد دارای ID، یک نام و یک خانه
و واقعا به این هک متوسل به موجب آن ما فقط
اعتماد که چیزی براکت
اشاره به موجودیت انسان در هر یک از این آرایه ها نامتجانس؟
ما در واقع می تواند این کار را انجام دهند.
اجازه بدهید من بروم بالا اصلی در حال حاضر، و اجازه دهید من خود من نوع داده ها ایجاد
واقعا برای اولین بار.
ما با استفاده از این روش در تقلا،
اما در اینجا من قصد دارم به رفتن به جلو و ایجاد یک نوع داده ها،
و شما می دانید، من قصد دارم به آن را به دانش آموز یا فرد،
و من قصد دارم به استفاده از typedef برای تعریف یک نوع است.
من قصد دارم بگویم این است که یک ساختار،
و سپس این ساختار از نوع دانشجویی، خواهیم گفت،
حتی اگر آن را کمی در حال حاضر برای من مورخ است.
خواهیم گفت "اعضای هیات شناسه."
ما می گویند "نام رشته."
سپس خواهیم "خانه رشته،" می گویند
بنابراین در حال حاضر با پایان این چند خط از کد
من فقط صدای جرنگ جرنگ آموزش داده شده است که وجود دارد وجود دارد
یک نوع داده ها علاوه بر نوع داده int، علاوه بر این رشته، علاوه بر دو برابر است، علاوه بر شناور است.
>> همانطور که از این لحظه در خط زمان 11، در حال حاضر وجود دارد یک نوع داده جدید به نام دانش آموزان،
و در حال حاضر من می توانم یک متغیر دانش آموز در هر نقطه من می خواهم اعلام،
پس مرا در پایین حرکت به مردم اجازه.
در حال حاضر من می توانم خلاص شدن از شر این است، و من می تواند به پایین دیوید،
و برای دیوید من در واقع می تواند که دیوید می گویند،
ما به معنای واقعی کلمه می تواند متغیر بعد از خودم نام،
دانشجویی نوع باشد.
این ممکن است کمی عجیب و غریب، به دنبال، اما این است که همه متفاوت
از اعلام چیزی به عنوان بین المللی یا یک رشته یا شناور.
این فقط اتفاق می افتد به نام دانش آموز در حال حاضر،
و اگر من می خواهم برای قرار دادن چیزی در درون این ساختار
من در حال حاضر مجبور به استفاده از یک قطعه جدید از نحو است، اما آن را بسیار سرراست است،
123، david.id = david.name = "دیوید" در پایتخت D،
و david.house = "ماتر"
و در حال حاضر من می توانم خلاص شدن از شر این مسائل در اینجا.
توجه کرده ایم در حال حاضر برنامه ما در واقع یک راه خیلی بهتر دوباره طراحی
که در آن در حال حاضر برنامه های ما بازتاب دنیای واقعی است.
>> یک مفهوم در دنیای واقعی یک شخص و یا یک دانش آموز وجود دارد.
در اینجا ما در حال حاضر نسخه C از یک شخص و یا بیشتر به طور خاص یک دانش آموز است.
داخل آن شخص این خصوصیات مربوطه،
ID، نام و خانه، به طوری راب اساسا همان چیزی می شود را در اینجا،
بنابراین دانشجوی راب، و در حال حاضر rob.id = 456،
rob.name = "راب".
واقعیت این است که متغیر نامیده می شود راب مرتب سازی بر اساس بی معنی است.
ما می توانیم آن را به نام X و Y و Z.
ما فقط نام آن را راب معنایی سازگار باشد،
اما در واقع این نام در داخل خود از این میدان،
بنابراین در حال حاضر من این است.
این نیز را مانند بهترین طراحی است که در من سخت کدگذاری دیوید احساس نمی کنند.
من سخت کدگذاری راب.
و من هنوز مجبور به توسل به برخی از کپی و پیست کنید هر زمان که من می خواهم متغیر جدید.
علاوه بر این، من به ظاهرا به هر یک از این متغیرها یک نام،
حتی اگر من خیلی ترجیح می دهم به توصیف این متغیرها
تر عموما به عنوان دانش آموزان است.
>> در حال حاضر ما می توانیم ایده هایی که کار کرده اند به خوبی برای ما ادغام
و در عوض، می گویند: "می دانید، من دانش آموزان متغیر نامیده می شود را،
و اجازه دهید آن را به اندازه 3 می شود، بنابراین در حال حاضر من می توانم اصلاح این بیشتر،
خلاص شدن از شر از دیوید دستی اعلام کرد،
و من به جای آن می تواند چیزی شبیه به دانش آموزان [0] در اینجا می گویند.
من پس از آن می توانید دانش آموزان [0] در اینجا می گویند،
دانش آموزان [0] در اینجا، و غیره، و من می توانم به اطراف
و تمیز که برای راب.
من هم می تواند در باره حالا شاید با اضافه کردن یک حلقه
و با استفاده از GetString و GetInt به واقع دریافت این مقادیر از کاربر است.
من می توانم در مورد اضافه کردن یک ثابت به دلیل این است که به طور کلی عمل بد
به کد سخت برخی از شماره های دلخواه مانند 3 در اینجا
و پس از آن فقط به یاد داشته باشید که شما باید بیش از 3 دانش آموز در آن قرار داده است.
احتمالا بهتر است به استفاده از # در بالای فایل را تعریف کنیم
و عامل که در خارج، به طوری که در واقع، به من اجازه رفتن به جلو و تعمیم این.
>> اجازه بدهید باز کردن یک نمونه است که در میان امروز
نمونه هایی در پیش است، structs1.
این برنامه کامل تر است که با استفاده از # تعریف اینجا
و می گوید: ما در حال رفتن به 3 دانش آموزان به طور پیش فرض.
در اینجا من اعلام ارزش کلاس از دانش آموزان،
بنابراین یک کلاس درس دانش آموزان، و در حال حاضر من با استفاده از یک حلقه
فقط کد را کمی ظریف تر، پر کلاس
با ورودی کاربر، پس از من = 0 در تکرار تا دانش آموزان، که 3.
و پس از آن کاربر در این نسخه من بی درنگ
ID دانش آموز، و من آن را با GetInt.
نام و نام خانوادگی دانش آموز، و سپس من آن را با GetString.
خانه دانش آموز چه خبر؟ من آن را با GetString.
و پس از آن در پایین در اینجا من فقط تصمیم به تغییر
چگونه من چاپ این خارج و در واقع استفاده از یک حلقه،
و من که هستم چاپ؟
با توجه به نظر من چاپ هر کسی در ماتر
و آن را تا راب و تامی و غیره در واقع تامی در مدر است.
تامی و دیوید را می توان در این مورد چاپ شده است، اما چگونه است که این کار؟
در حال حاضر به این تابع دیده می شود نه قبل از، اما حدس می زنم که چه می کند این را.
مقایسه رشته ها.
>> آن را کمی غیر آشکار که چگونه آن را مقایسه رشته ها به دلیل آن معلوم
اگر آن را می گرداند 0 این بدان معناست که رشته با هم برابر هستند.
اگر آن را می گرداند برابر با -1 است که یکی از حروف الفبا می آید قبل از دیگر،
و اگر آن را می گرداند +1 این بدان معناست که به عبارت دیگر می آید بر اساس حروف الفبا
قبل از دیگری است، و شما می توانید آنلاین نگاه کنید و یا در صفحه مرد
برای دیدن که دقیقا راه این است که، اما این همه در حال حاضر انجام آن را گفت
در صورتی که [من]. خانه برابر "ماتر"
سپس به جلو بروید و چاپ خارج و در مدر است.
اما در اینجا چیزی است که ما را دیده اند، نه قبل از، و ما دوباره به این.
من به یاد هرگز نیاز به انجام این کار در هر یک از برنامه های من است.
رایگان است ظاهرا اشاره به حافظه، آزاد کردن حافظه،
اما آنچه در حافظه من ظاهرا در این حلقه آزاد در انتهای این برنامه؟
به نظر می رسد مثل من آزادی نام یک شخص
و خانه یک فرد، بلکه این است که چرا؟
>> از تمام این هفته تبدیل شده است که شما با استفاده از GetString
ما که به نوعی معرفی یک اشکال را در هر یک از برنامه های خود را.
GetString طراحی شده توسط حافظه اختصاص به طوری که می تواند به شما یک رشته،
مانند داود، یا دزدی، و بعد از آن شما می توانید هر آنچه می خواهید انجام دهید
با این رشته را در برنامه های خود را به خاطر ما محفوظ است حافظه برای شما.
مشکل تمام این مدت هر وقت با شما تماس GetString
ما نویسندگان GetString اند، درخواست شده است سیستم عامل
به ما کمی از RAM را برای این رشته است.
با ما کمی از RAM را برای این رشته آینده است.
RAM بیشتری برای این رشته بعد به ما بده.
چیزی که شما، برنامه نویس، شده اند هرگز انجام
به ما که به حافظه،
بنابراین برای این چند هفته از برنامه های شما نوشته شده است
تا به حال چیزی است که یک جهش حافظه نامیده می شود که به موجب آن آنها را با استفاده از
بیشتر و بیشتر حافظه در هر زمان با شما تماس GetString، و این خوب است.
ما عمدا انجام این کار را در هفته اول به دلیل آن است که جالب نیست
مجبور به نگرانی در مورد که در آن رشته است که از.
همه شما می خواهم کلمه راب برای آمدن به عقب زمانی که کاربر آن را انواع شوید.
>> اما در حال حرکت رو به جلو ما در حال حاضر به شروع به گرفتن پیچیده تر در این مورد است.
هر زمان که ما به حافظه اختصاص دهد بهتر است در نهایت آن را پشت دست.
در غیر این صورت در دنیای واقعی بر روی مک یا PC خود را، شما ممکن است گاهی اوقات تجربه
علائم که در آن کامپیوتر شما آسیاب را به توقف در نهایت
یا احمقانه ساحل توپ در حال چرخش است فقط اشغال کامپیوتر
توجه تمام است و شما می توانید کارها را انجام ندهید.
است که می تواند با هر تعداد از اشکالات توضیح داده شده است، اما در میان کسانی که اشکالات احتمالی
چیزهایی هستند که به نام نشت حافظه به موجب آن کسی که نوشت: این قطعه از نرم افزار
شما با استفاده از به حافظه آزاد را به یاد داشته باشید
که او یا او پرسید: سیستم عامل برای،
استفاده نمی GetString، چرا که یک چیز CS50، اما با استفاده از توابع مشابه
است که از سیستم عامل برای حافظه است.
اگر شما و یا پیچ کردن و در واقع هرگز به بازگشت که حافظه
یکی از نشانه های که می تواند این باشد که یک برنامه آهسته و آهسته و آهسته تر
مگر اینکه شما به یاد داشته باشید تماس رایگان.
>> خواهیم آمد به زمانی و به همین دلیل شما می توانید تماس رایگان،
اما اجازه دهید به پیش فقط برای اندازه گیری خوب است و سعی کنید در حال اجرا این برنامه خاص.
این structs1 نامیده می شد، را وارد کنید.
اجازه دهید من به جلو بروید و آن را اجرا structs1، 123، دیوید ماتر
456، راب Kirkland، 789،
تامی ماتر، و ما می بینیم دیوید در ماتر، تامی در مدر است.
این فقط یک بررسی سلامت عقل کوچک است که این برنامه در حال کار است.
متاسفانه، در حال حاضر، این برنامه کمی نا امید کننده است که در آن
من همه این کار، من در 9 رشته مختلف تایپ شده است، ضربه وارد کنید،
گفته شده بود که قرار بود در ماتر، با این حال بدیهی است که من می دانستم که قرار بود در ماتر در حال حاضر به دلیل من آن را تایپ.
این امر می تواند حداقل خوب اگر این برنامه بیشتر شبیه به یک پایگاه داده
و آن را در واقع به یاد آنچه که من در تایپ
بنابراین من دیگر هرگز به ورودی این پرونده دانشجویی.
شاید آن را مانند یک سیستم registrarial است.
>> ما می توانیم با استفاده از این تکنیک شناخته شده به عنوان فایل فایل ورودی و خروجی I / O، انجام دهید،
یک راه بسیار کلی گفت: هر زمان که شما می خواهید به خواندن فایل ها و یا نوشتن فایل
شما می توانید این کار را با مجموعه ای از توابع انجام دهد.
اجازه بدهید به جلو و باز کردن این structs2.c عنوان مثال،
است که تقریبا یکسان است، اما اجازه دهید ببینیم که چه چیزی آن را در حال حاضر می کند.
در بالای فایل من اعلام یک کلاس از دانش آموزان است.
من پس از آن طبقه با ورودی کاربر پر،
بنابراین کسانی که خط از کد را دقیقا قبل از اینکه می خواهم.
پس اگر من در پایین حرکت کنید در اینجا من نسخه قابل چاپ همه کسانی که در ماتر خودسرانه قبل از دوست،
اما این از ویژگی های جدید و جالب است.
این خط از کد جدید هستند، و آنها به معرفی چیزی در اینجا،
فایل، کلاه، و آن * در اینجا نیز است.
اجازه بدهید این حرکت من در اینجا، * در اینجا به عنوان خوب.
>> این تابع ما را دیده اند، نه قبل از آن، fopen،
اما این معنی است که فایل باز است، بنابراین اجازه دهید شیر خامه گرفته از طریق این،
و این چیزی است که خواهیم دوباره به در psets آینده است،
اما این خط در اینجا اساسا باز می شود یک فایل به نام پایگاه داده،
و آن را به طور خاص به آن باز می شود به گونه ای که از آن می تواند آنچه را به انجام آن؟
[نامفهوم دانشجو]
راست، بنابراین "W" فقط بدان معنی است که گفتن سیستم عامل
باز کردن این فایل در چنین راهی که من می توانم به آن ارسال شده است.
من نمی خواهم به آن را بخوانید. من نمی خواهم فقط به آن نگاه کنید.
من می خواهم آن را تغییر دهید و اضافه کردن مواد به طور بالقوه به آن،
و فایل به نام پایگاه داده است.
این می تواند به نام هر چیزی.
این می تواند database.txt. این می تواند باشد. DB.
این می تواند یک کلمه مانند صنایع غذایی، اما من خودسرانه تصمیم گرفت تا نام فایل پایگاه داده است.
ورود به سلامت عقل کمی که می کنیم دوباره در جزئیات بزرگ در طول زمان است،
اگر FP، برای اشاره گر فایل، آیا NULL برابر این بدان معناست که همه خوب است.
>> داستان کوتاه بلند، توابع مانند fopen گاهی اوقات شکست.
شاید فایل وجود ندارد. شاید شما از فضای دیسک.
شاید شما اجازه انجام این کار را به آن پوشه را نداشته باشند،
بنابراین اگر fopen چیزی تهی را بر می گرداند بدی رخ داده است.
برعکس، اگر fopen تهی نمی گرداند همه خوب است
و من می توانم شروع به نوشتن به این فایل.
در اینجا یک ترفند جدید.
این حلقه برای که تکرار بیش از هر یک از دانشجویان من است،
و این به نظر می رسد بسیار شبیه به آنچه که ما انجام داده ایم، قبل از،
اما این تابع یک پسر عموی به printf fprintf برای فایل printf به نام،
را متوجه شده و آن را در تنها 2 راه متفاوت است.
یکی، آن را با F به جای P شروع می شود،
اما بعد از آن آرگومان اول آن است که ظاهرا چه؟
[دانشجویان] فایل. >> این فایل.
این چیزی به نام FP، که ما سرانجام از هم جدا خواهیم کسی را دست انداختن یک اشاره گر فایل،
اما در حال حاضر FP به سادگی فایل را نشان می دهد که من آن را باز،
تا fprintf در اینجا می گوید نسخه قابل چاپ ID کاربر را به فایل، نه به صفحه نمایش.
چاپ نام کاربر به فایل، به صفحه:
خانه را به فایل، به روی صفحه نمایش، و پس از آن را در اینجا، بدیهی است که،
بستن فایل، و سپس آزاد کردن حافظه.
>> تنها تفاوت بین این نسخه 2 و نسخه 1
معرفی fopen و این فایل را با *
و این مفهوم fprintf، بنابراین اجازه دهید را ببینید چه نتیجه نهایی شده است.
اجازه بدهید من به پنجره ترمینال من.
اجازه دهید من structs2 اجرا، وارد کنید.
به نظر می رسد مانند همه خوب است. بیایید عمل structs2.
123، دیوید میظر، 456، راب Kirkland،
789، تامی مدر را وارد کنید.
به نظر می رسد مانند آن رفتار یکسان است، اما اگر من در حال حاضر انجام LS
توجه کنید چه فایل در اینجا در میان همه کد، پایگاه داده،
باز که gedit پایگاه داده، و نگاهی که به شما اجازه می دهد تا.
این آنتی ویروس از فرمت های فایل نیست.
این واقعا یک قطعه از خط داده در هر خط در هر خط است،
اما کسانی از شما که با استفاده از فایل اکسل و یا CSV، کاما از هم جدا ارزش ها،
من قطعا می تواند مورد استفاده قرار fprintf به جای آن شاید چیزی شبیه به این
به طوری که من در واقع می تواند معادل یک فایل اکسل ایجاد
با جدا کردن همه چیز با کاما، فقط خطوط جدید.
>> در این صورت اگر من به جای استفاده کرده بودند و کاما به جای آن از خطوط جدید
من به معنای واقعی کلمه می تواند این فایل پایگاه داده در اکسل باز اگر من به جای آن ساخته شده آن را شبیه به این.
به طور خلاصه، در حال حاضر که در حال حاضر قدرت را به نوشتن بر روی فایل
ما در حال حاضر می تواند داده های تداوم، شروع به نگه داشتن آن را در اطراف بر روی دیسک
به طوری که ما می توانیم اطلاعات را در اطراف را دوباره و دوباره.
متوجه زن و شوهر از چیزهای دیگر که در حال حاضر کمی بیشتر آشنا.
در بالای این فایل C typedef
چون ما می خواستیم برای ایجاد یک نوع داده است که نشان دهنده یک کلمه،
بنابراین این نوع نامیده می شود کلمه، و در داخل این ساختار
کمی خیال باف در حال حاضر.
چرا کلمه ای است که ظاهرا یک آرایه ساخته شده است؟
فقط یک کلمه به طور مستقیم چیست؟
>> این یک آرایه ای از کاراکتر ها است.
این دنباله ای از کاراکتر ها پشت به پشت به پشت.
نامه در تمام کلاه اتفاق می افتد به ما خودسرانه می گویند حداکثر طول
هر کلمه در فرهنگ لغت است که ما با استفاده از تقلا.
چرا +1 من داشته باشد؟
شخصیت تهی.
به یاد بیاورید هنگامی که ما انجام مثال Bananagrams ما نیاز به یک مقدار خاص
در پایان از کلمه به منظور پیگیری
که در آن کلمات در واقع به پایان رسید، و به عنوان مشکل مشخصات مجموعه می گوید:
در اینجا ما در حال همکاری با یک کلمه داده شده یک مقدار بولی،
پرچم، پس به صحبت می کنند، درست یا غلط است.
آیا شما این واژه در حال حاضر، چون ما متوجه
ما واقعا نیاز به یک راه به خاطر سپردن نه تنها یک کلمه است که در تقلا
اما اینکه آیا یا نه شما، انسان، آن را در بر داشت
به طوری که اگر شما پیدا کلمه "" شما فقط نمی تواند نوع، را وارد کنید، را وارد کنید، را وارد کنید
و گرفتن 3 امتیاز، 3 امتیاز، 3 امتیاز، 3 امتیاز.
ما می خواهیم به قادر به لیست سیاه آن کلمه با تنظیم بولی
درست است اگر شما در حال حاضر آن را در بر داشت، و به طوری که به همین دلیل ما
در این ساختار محصور شده است.
>> در حال حاضر، پایین اینجا در تقلا این ساختار دیگر به نام فرهنگ لغت وجود دارد.
نبود کلمه typedef چرا که در این مورد
ما نیاز به در محفظهای قرار دادن این ایده از یک فرهنگ لغت،
و یک فرهنگ لغت شامل یک دسته از کلمات،
توسط این آرایه را دارد، و چگونه بسیاری از این واژه ها وجود دارد؟
خوب، هرچه این متغیر به نام اندازه می گوید.
اما ما فقط نیاز به یک فرهنگ لغت.
ما یک نوع داده به نام فرهنگ لغت نیاز ندارد.
ما فقط به یکی از آنها است، بنابراین به نظر می رسد در C
که اگر شما می گویند نیست typedef، شما فقط می گویند ساختار، و سپس در داخل آکولاد
شما قرار داده و متغیرهای خود را، پس از آن به نام شما قرار داده است.
این است که اعلام یک متغیر به نام فرهنگ لغت
که به نظر می رسد شبیه به این.
در مقابل، این خطوط در حال ایجاد یک ساختار داده ها قابل استفاده مجدد نامیده می شود کلمه
که شما می توانید نسخه های متعدد، درست مثل ما ایجاد
نسخه های متعدد از دانش آموزان.
>> چه این در نهایت ما را به انجام اجازه می دهد؟
اجازه بدهید به عقب برویم به، بیایید می گویند، یک مثال ساده تر از زمان ساده تر،
و به من اجازه باز کردن، اجازه دهید می گویند، compare1.c.
مشکل در اینجا در دست است که در واقع پوست برگشت
لایه ای از یک رشته و شروع به در نظر گرفتن این چرخ آموزش
زیرا که معلوم است که یک رشته تمام این مدت
این است که ما در هفته (1) واقعا وعده فقط یک اسم مستعار است،
مترادف از کتابخانه CS50 برای چیزی است که به نظر می رسد کمی بیشتر مرموز،
* کاراکتر، و ما دیده ایم این ستاره قبل از.
ما آن را در زمینه فایل ها را دیدم.
>> اجازه دهید در حال حاضر به همین دلیل ما مخفی شده این جزئیات برای برخی از زمان در حال حاضر.
در اینجا است که یک فایل با نام compare1.c،
و ظاهرا می پرسد که کاربر به مدت 2 رشته، S و T،
و پس از آن تلاش می کند تا این رشته برای برابری در خط 26 مقایسه،
و اگر آنها برابر آن را می گوید، "شما همان چیزی تایپ"
و اگر آنها برابر نیست آن را می گوید، "شما تایپ چیزهای مختلف است."
اجازه بدهید من به جلو بروید و این برنامه را اجرا کنید.
اجازه بدهید من به پوشه منبع من، compare1. آن وارد شده درست است.
اجازه compare1 اجرا من.
من در زوم را وارد کنید.
چیزی می گویند. سلام.
من چیزی دوباره می گویند. سلام.
من قطعا چیزهای مختلف تایپ کنید.
>> اجازه بدهید این را امتحان کنید دوباره به من. خداحافظ خداحافظ.
قطعا متفاوت است، بنابراین در اینجا چه خبر است؟
خب، واقعا در خط 26 در مقایسه؟
[نامفهوم دانشجو]
بله، به طوری که معلوم است که یک رشته، نوع داده، نوع دروغ سفید.
رشته * کاراکتر است، اما چه * کاراکتر؟
A * کاراکتر، به آنها می گویند، یک اشاره گر است،
و یک اشاره گر است که به طور موثر یک آدرس،
مجموع نوشته ها در حافظه، و اگر شما اتفاق می افتد به در یک کلمه HELLO تایپ،
به یاد از بحث های گذشته رشته
این مثل کلمه HELLO.
به یاد داشته باشید که یک کلمه مانند HELLO می توان به نمایندگی
به عنوان یک آرایه ای از کاراکتر ها مثل این
و پس از آن با یک شخصیت خاص در پایان نام شخصیت تهی،
به عنوان نشان دهنده \.
چه شده است که در واقع یک رشته؟
توجه کنید که این تکه های مختلف از حافظه،
و در واقع، در پایان از آن است که فقط هنگامی که شما را از طریق تمام رشته نگاه
به دنبال شخصیت تهی خاص.
اما در صورتی که این یک تکه از حافظه از حافظه کامپیوتر من،
اجازه دهید خودسرانه می گویند که این رشته فقط خوش شانس،
و آن را در همان ابتدا از RAM کامپیوتر من قرار داده شد.
این BYTE 0، 1، 2، 3، 4، 5، 6 است ...
>> وقتی که من می گویند چیزی شبیه به GetString و من رشته S = GetString
چه چیزی واقعا در حال گردد؟
برای این چند هفته گذشته، آنچه که واقعا در S ذخیره می شود
این رشته در هر سه نیست، اما در این مورد آنچه که ذخیره شده است
0 تعداد زیرا آنچه GetString در واقع
آن را نشانی از لحاظ جسمی بازگشت یک رشته است.
که حتی نمی واقعا مفهومی حس می کند.
چه آن را نشانی از بازگشت یک عدد است.
این تعداد آدرس HELLO در حافظه است،
رشته ها و پس از آن، اگر ما در پوست برگشت این لایه، رشته واقعا وجود ندارد.
این تنها ساده سازی در کتابخانه CS50.
>> این واقعا چیزی به نام * کاراکتر است.
کاراکتر را حس می کند، زیرا یک کلمه، مانند HELLO؟
خوب، آن یک سری از کاراکتر، یک سری از کاراکتر ها است.
* کاراکتر به معنای آدرس از یک شخصیت،
پس چه می کند این به معنای یک رشته به بازگشت؟
زیبا، ساده ترین راه بازگشت به یک رشته
به جای سعی کنید تا بفهمند که چگونه من به 5 یا 6 کلمه در ادامه متن مختلف را به شما بر می گردانند
اجازه دهید من به آدرس که BYTE بازگشت؟
یکی از اولین.
به عبارت دیگر، اجازه دهید من به شما آدرس یک شخصیت در حافظه را به من بدهید.
این چیزی است که * کاراکتر نشان دهنده آدرس یک شخصیت تنها در حافظه است.
با که متغیر تماس بگیرید.
فروشگاه که آدرس خاص، که من خودسرانه گفت 0 است،
فقط برای نگه داشتن چیزهای ساده است، اما در واقع آن را به طور کلی یک شماره بزرگتر است.
>> یک دقیقه صبر کنید.
اگر شما فقط به من آدرس اولین کاراکتر، چگونه می توانم من می دانم که چه آدرس
شخصیت دوم، سوم، چهارم و پنجم است؟
[نامفهوم دانشجو]
شما فقط جایی که انتهای رشته از طریق این ترفند مفید می دانید،
بنابراین، هنگامی که شما در استفاده از چیزی شبیه به printf، چه printf به معنای واقعی کلمه به عنوان آرگومان آن طول می کشد،
به یاد آورید که ما با استفاده از نگهدارنده این٪ s را، و پس از آن به شما منتقل
متغیر است که ذخیره سازی یک رشته است.
آنچه شما واقعا عبور آدرس از شخصیت برای اولین بار از این رشته است.
Printf پس از آن با استفاده از یک حلقه یا یک حلقه در حالی که پس از دریافت آن آدرس،
به عنوان مثال، 0، بنابراین من این کار را حالا،
printf ("٪ S \ N،")؛
وقتی که من اسمش printf ("٪ S \ N،" S)؛ آنچه که من واقعا ارائه printf با
آدرس اولین کاراکتر در ثانیه است، که در این مورد دلخواه است H.
>> چگونه printf آنچه که دقیقا بر روی صفحه نمایش را می دانید؟
کسی که اجرا printf در حالی که پیاده سازی یک حلقه یا حلقه
است که می گوید: آیا این شخصیت برابر شخصیت تهی خاص؟
اگر نه، آن را چاپ کنید. چگونه در مورد این یکی؟
اگر آن را چاپ نمی کند، آن را چاپ کنید، آن را چاپ کنید، آن را چاپ کنید.
آه، این یکی خاص است. جلوگیری از چاپ و بازگشت به کاربر.
و این به معنای واقعی کلمه تمام شده است که اتفاق می افتد در زیر هود،
و این که تا حد زیادی به هضم در اولین روز از کلاس،
اما در حال حاضر آن را در واقع بلوک ساختمان همه چیز فهم
شده است که در داخل حافظه کامپیوتر،
و در نهایت ما از این از هم جدا کسی را دست انداختن با کمک کمی
از یکی از دوستان ما در دانشگاه استنفورد است.
>> پروفسور نیک Parlante در دانشگاه استنفورد انجام داده است این ویدئو فوق العاده دنباله
از همه نوع از زبان های مختلف که معرفی
این کمی Claymation Binky شخصیت.
صدای شما در فقط یک پیش نمایش چند دزدکی حرکت کردن دوم را بشنود
این است که از یک استاد دانشگاه استانفورد، و شما در حال گرفتن
تنها 5 یا 6 ثانیه از این حق در حال حاضر،
اما این توجه داشته باشید که در آن خواهیم نتیجه گیری امروز است
و در روز چهارشنبه آغاز خواهد شد.
من به شما سرگرم کننده اشاره گر با Binky، پیش نمایش.
[♪ موسیقی ♪] [پروفسور Parlante] با سلام، Binky.
از خواب بیدار. این زمان برای تفریح ​​و اشاره گر است.
[Binky] چه خبر؟ اطلاعات در مورد اشاره گر؟
اوه، مغز گردو و غیره!
>> ما شما را در روز چهارشنبه را ببینید.
[CS50.TV]