[За възпроизвеждане на музика] DAVID J. Malan: Това е като първокурсник семинар днес. ДОБРЕ. Така че много дъждовно навън. Тази тенденция да се случи в сряда, но още по-възможност за въпроси днес. Така че нека да започнем действително с филма в един момент. Но ние ще започнем грандиозен начин, както винаги. Това е CS50, и този е края на 4-та седмица. Така че, ако някога сте се наблюдаваше TV или филм, където Има някои компютърни експерти и полицията или ФБР, или някаква агенция се опитва да улови някои противник, добре, вие сте Вероятно чували израза "подобри" с което въпросното техник по някакъв начин магически отдалечава в безкрайно далеч, за да видим престъпниците самоличност или регистрационния номер в още блещукането на огледало или блясъка на нечие око. Така че наистина, нека да разгледаме най- няколко такива сцени от Холивуд. [Възпроизвеждане на видео] -OK, Сега нека се добър поглед към вас. -Чакай. Тичане, че обратно. -Wait Минута. Отиди надясно. -Има, Че замразява. -Цял екран. -OK, Че замразява. -Tighten Нагоре по този въпрос, ще ви? -Vector В по тази човек от гърба колело. -Zoom В точно тук на това място. -С Право оборудване, изображението може да бъде разширяван и заточени. -Какво е това? -Това Е програма за аксесоар. -Може Ли ясно, че до всеки? -Не знам. Нека да го засили. -Enhance Раздел A6. -I Засилено детайла, and-- Мисля, че има достатъчно, за да се подобри, тя предоставя на екрана си. -I Засилено отражението в окото си. -Let Е стартирате тази през видео аксесоар. -Edgar, Може ли да се подобри това? -Hang Нататък. -I've Работи по този размисъл. Размисъл -Someone му. -Reflection. -Има Е отражение на лицето на мъжа. -В Размисъл. -Има Е отражение. -Zoom В върху огледалото. -Можете Да видите отражение. -Може Ли повишаване на имиджа от тук? -Може Ли да го подобри точно тук? -Може Ли да го подобри? Можеш ли да го подобри? -Може Ние се подобри това? -Може Ли да го подобри? -Hold Върху втора, аз ще се повиши. -Zoom В по вратата. -Times 10. -Zoom. -Нанасям се. -Повече. -Wait, Спрете. -Спри се. Тя -Pause. -Rotate Ни 75 градуса около вертикалата, моля. -Спри се. Върни се в част за вратата отново. -Got Подобрител изображение, което може растерна графика? -Hey, Може би ние можем да използваме Pradeep Метод Sen да видите в прозорците. -Това Софтуер е състоянието на техниката. -В Собствена стойност е изключен. -С Правото комбинация от algorithm-- Взети елиминиране -Той е алгоритми до следващото ниво, и мога да ги използвате, за да засилване на тази снимка. -Lock На и уголемяване на Z-ос. -Enhance. -Enhance. -Enhance. -Freeze И подобряване. [END PLAYBACK] DAVID J. Malan: Добре де, Всички тези са действително думи. Те просто нанизани заедно в начин, че всъщност не е разумно. И в действителност, CS50 и обучение, като го има тенденция да съсипе много телевизия и филми за теб. Защото, когато тези компютърни специалисти са тракащ разстояние изражение и каза: фантазия неща като собствени вектори, и Z-оста, и всякакъв брой други всъщност повече от техническа гледна точка, те са наистина просто садене думи заедно твърде често. Е, че една от надеждите ни е, че като страничен ефект от приема на курсове като този, ще повече хора в свят действително да бъде в състояние да се претегля в и просто все така леко да повлияе на качеството и точността на тези филми? Всъщност, нека да погледнем реалността. Така че тук е снимката на персонала на Мери, един от нашите учебни събратя. И предполагам, че тя е заподозрян в нещо. И все пак, има искрица някои от доказателствата в очите й, или в отражението на нейните очила. Е, ако ние правим точно както филмите предложи, където ние я увеличите и "подобри", това е колко много информация е в лицето на Мария когато заснемете изображение с тази оригинална резолюция. И, всъщност, можете да видите тези точки. И ето какви са наречени пиксели, P-I-X-Е-Л-S, който е само на един квадратен обикновено че е точка, която съставя изображение. И през деня, а всъщност дори днес с някои от днешния LED телевизори или LCD телевизори, ако имаш един в стаята си или в къщи, ако отидете до супер близо до него, и особено ако това е малко по-стар телевизор, най-вероятно дори може да видите тези точки и това е, което композира изображение. И няма по- информация от това. Бихме могли да "подобри", в смисъл на изглаждане неща отново и сортиране на извод вид, нещо като това, което цвят трябва да бъде в непосредствена близост до очите на Мери така че тя всъщност не е толкова пикселизирани. Но ако продължавам да приближите, има е лош човек в очите й. Подобно на това е всичко, на информация имаме. Вие не можете да създадете информация от нищо. Има само ограничен брой битове там. Така че в Проблемна Set 4, където имате възможност да играе с този вид свят. В Проблем Set 4, ще проучи свят на графики и криминалистика, и действително писане на код че възстановява загубени изображения. Ще пиша код, който манипулира съществуващи изображения и в крайна сметка се разбере какво е става под предния капак. И се оказва, че всъщност Не всичко, което сложно. Например, ако искаме да представляват усмивка на лицето, където с тези черните пиксели, или тези черни точки, добре, бихме могли просто да означават тях като истински растерна графика. И ако някога са чували, че изразяване на растерна графика, може би то сега започва да се направи Днес малко повече разум. Ние вече знаем какво е малко. Това е 0 или 1. И карта е просто нещо като лист хартия , която ви дава посоки и има може би решетка от х- и у координати. Така че тук е растерна графика. Това е карта на битове при което 1 е очевидно ще представлява бял пиксел, и 0 ще представлява един черен пиксел. Но ние със сигурност може да го обърнете наоколо. Това няма значение, така че Докато ние сме последователни. И тук е как, в binary-- вътре от паметта на компютъра, или дори вътре на даден файл на вашия хард drive-- може ли да се съхранява най-простият от усмихнати снимки на лицето. Но това, което сме ние, разбира се, липсва в тази картинка? Color, нали? Това е очевиден следваща стъпка или аксесоар за подобряване на тази с цвят. Така че за съжаление само с едно битов, 0 или 1, бихме могли да представляват цвят. Това може да е червен или син, или черно, или бяло или зелено или розово, или някакви двойки цветове. Но за простота, ние ще Просто поеме черно и бяло. Така че това, което логично се нуждаем, ако ние искат да приложат цвят в дадено изображение? Какво трябва да направя? Подобно, ако ограничителният фактор тук е, че с един бит вие само можете представляват две държави, 0 или 1, бяло или черно, какво искаш да направя? Аудитория: Повече данни. DAVID J. Malan: Още бита, Да повече данни, повече битове. И наистина, това е точно как цветни изображения са представени. Вместо да се използва един единствен бит, а 0 или 1, за всеки пиксел, всяка точка, можете просто да използвате множествена. Може да използвате 8, може би, по-често използвате 24, и наистина, в Проблем Set 4, ще играете с файл формат, който използва 24 бита обикновено. Но повечето от вас вероятно са запознат с JPEG. Ако някога сте се вземат снимка на телефона си, или качен или видял нещо на Facebook или Flickr, произволен брой на уебсайтове фото-базирани, вие сте вероятно виждал JPEG изображение преди. И се оказва, че това е файла формат ние ще използваме в PSet 4, при което започваш да Трябва да се възстанови снимки че съм случайно изтрити от повреден карта с памет във фотоапарата, ако щете. И се оказва, че въпреки че JPEG е доста sophisticated-- това е много по-сложен от черни и бели точици видяхме преди малко, защото има всъщност фантазия алгоритми, които се използват за компресиране на JPEG, така че можете да имате една наистина хубава, качество на картината, но при използване сравнително малко бита. И ние ще се върнем към компресия не след дълго. Оказва се, че първият три байта в JPEG image-- без значение какво сте взели снимка of-- са ценностите, 255, 216, 255. С други думи, ако просто се види, че модел на бита, представено тук като три байта или 24 бита общо, с висока степен на вероятност може да заключим, че Вие разглеждате то този първи три байтовете на JPEG. И това е, което е известно като подписването на JPEG. Много от файлови формати там са склонни да започнете с някои модели на 0s и 1S, така че Windows и Mac OS и IOS, и Android знам какъв вид файл те са, в допълнение към така наречената файл разширение, което много файлове имат. Ако сте .jpg, това е друг ключ към компютъра. Така че нека сега да разгледаме този малко по-технически. Знаем десетичната система е от 0 до 9. Знаем двоичен е 0 и 1. И ако мислите, че обратно на PSet 0, имахме сте се борят с, за малко, нещо, наречено шестнадесетичен, където имате 16 цифри, вместо 10 или вместо 2. И тези цифри, по силата на споразумение, са от 0 до 9 и след това чрез е, когато е това, което представлява десетичен номер, точно като бърз здрав разум проверите? Така че, 15. И трябва да представлява 10, само с природата на подредбата, които съм дал. Това е просто произволно конвенция, но това е доста стандартно. Така че, ако се вгледаме в този модел на три bytes-- позволим Просто започнете да го погледнете в по начин, съобразен с начина, компютърни специалисти обикновено Посетете и мисля за файлове. Вие със сигурност може да се мисли за файлове в 0s и 1s и десетични, но в действителност, ние сме склонни да се използва двоичен или по-типично hexadecimal-- обратно от PSet 0. Така че нека да предложа 255, 216, 255 и са само тези модели на 0s и 1S. И вие можете да проверите това, ако сте искате да направите по математика от седмица 0. Но, за сега, просто се предположи, че това действително е правилна. Току-що се пренаписват три десетични числа като три двоични стойности. Сега това, което аз ще направя, е Просто добавете малко бяло пространство, Просто заради четивността на. И бележка, аз съм просто ще да се движат нещата от друг. Така че, преди, след, преди, след. Правя нищо интересно друго от просто разпространение нещата така това известие всеки набор от осем бита сега е два комплекта от по четири бита. Това е полезно, защото шестнайсетична е особено на мода защото всеки шестнадесетичен цифра 0 чрез F, или по-специално от 0 до 15, могат да бъдат представени с точно четири бита. С други думи, в шестнадесетичен, ако Искам да представлява 0, това е просто 0000, четири нули. А ако искате да представляват 15, това е 1111, което е четири бита. И ако го направите по математика, ако това е мястото, такива, това е мястото, 16S, това ще даде you-- по-скоро, че ще ходи to-- Съжалявам, в двоичен, това ще ви дам 15, от тях място, избиват място, четворки и осмици място. Така че нека да предложа, че комплект от четири бита на ляво е това, което ние ще наричаме ф. Това е най-големият номер, който може да представлява с четири бита. И ние вече знаем от шестнадесетичен, е най-голямата цифра е в шестнадесетичен вид. Имаме още е там, още там две. И за сега, просто приемете на вяра че съм направил правото на математика и че лявата половина на тези битове, 1101, е същото като г в шестнадесетичен вид. И десницата, 1000, е само 8. И лесно, че един, за да видите, нали? В 8 represents-- е прав отдолу, че осмици място. Така че ние имаме един в графата осмици и нищо в четворки, вторите или такива. Така че сега е по-конвенционално, хората са склонни да напише шестнадесетични цифри, като този, можете просто да ги мачкам заедно, и след това можете да ги префикс с 0x. Това означава нищо друго, освен визуална представа за human-- тук идва шестнадесетичен value-- защото тя не може по друг начин да е очевидно. Което ще рече, в крайна сметка, че модела на нули и единици, или модела на шестнадесетичен цифри еквивалентно че сте Ще започнете да търсите Проблем в Set 4 е this-- И проблемът Set 4 спец ще ходим вас чрез този в повече detail-- но осъзнаваме като нещо като тайнствена Това може да изглежда на пръв поглед, започваш да започнете да виждате това много. И в действителност, дори в GDB, на дебъгер ние въведохме в понеделник и Dan въвежда в PSet 3, ще да често ви покажа шестнадесетични стойности Просто защото те са склонни да бъдат по- конвенционален от десетична или двоичен в света на компютрите. Сега нека да поставим това в контекст. Много от вас може би си спомняте тази представям тук, което дойде от това, което? Vista, така че дори и по-рано от че Windows XP е направил това дебют. Така че това е един красив пейзаж. И всъщност, ако мушкам около online-- Мисля, че това е една статия в Уикипедия, където някой много невероятно излязоха Намерих това място в света, създаден неговата или нейната камера в точно прави place-- и това днес изглежда like-- но това е точно една и съща настройка. Този образ, обаче, е във файл формат, наречен растерна графика, б-т-р. И ние ще вземе супер бърз поглед към какво означава това. Но растерна графика е просто различен начин на представляващи снимки още използват пиксела в 0s и 1S, в крайна сметка. Но най-бърз поглед, тя има по-интересен подпис в началото на файла. Това не е само три байта, а има цял куп модели на байта които са предварително определено значение. Например, някъде в първите няколко байта от растерно изображение ще бъде размерът на образ, ширината на изображението, височината на изображението, така че полезни метаданни, ако щете. Полезна информация, че Photoshop или каквито и графична програма, която използвате може в действителност да се грижи за. Така че повече по този въпрос в Проблем Определете 4, но това Само да кажа, че в края на деня всички файлови формати, които сте използвали за years-- файлове на Microsoft Word, Числа файлове, Excel файлове, произволен брой файлови формати които биха могли да имат някаква Известно файлово разширение са само 0-ли и 1S ходовата част на предния капак. И хората са решили какво конвенциите са, какви модели на 0s и 1S представляват на Word файл спрямо файл Excel, срещу всякакъв брой други формати. Така че в PSet 4, ще имате възможност да играят с това. Но какво означава това да има структура на. Това всъщност е хубаво Segue сега в C, който има само една двойка на допълнителни функции, които не сме погледна, все още. Това е доста малък език и един от хубавите черти около C е структура на. Например, ако сте Исках да represent-- нека речем, че е искал да има променлива, която представлява един студент в някоя програма. Може би сте били написването на игрище програмата за регистрация, или сърцевина за пазаруване инструмент, или нещо подобно. Какви са парчета от данни, свързани на ученик, който дойде на ум? Като студент е представено с какви стойности? Да? Имаш име като студент. Какво друго типичен студент има? АУДИТОРИЯ: [недоловим] DAVID J. Malan: Така че, съжалявам. АУДИТОРИЯ: Age. DAVID J. Malan: An възраст или рожден ден еквивалентно, Аха. Какво друго? АУДИТОРИЯ: ID номер? DAVID J. Malan: Така идентификационен номер, може би телефонен номер, може би в общежитието, или къща, или колеж, или нещо подобно. Всеки брой на парчета от данни, които може да се наложи в списъка с контакти е това, което може да се определи един студент. Така че, ако ние искахме да направим това, в кода, бихме могли да направим нещо по-просто като това. Ние може да има програма, така че има да речем, инт главната (недействителни). И ако искам да представляват студент I може да има, например, низ, наречен на името на студента, низ, наречен общежитието за този ученик, Може би едно цяло число, наречено ID за този ученик. И тъй като аз съм с низ, I Трябва да се върна и да се примири CS50.h. Може би ще ми трябва stdio.h. Така че нека да изпреварващо да направя тези и аз съм Ще се обадя на този student.c за сега и спести това. И сега мога да направя нещо с тези променливи. И ние просто ще напиша че като коментар в псевдо код, защото не е интересно това, което правим за сега. ОК, така че това е програма, която някак съхранява студент. Какво искам да направя, ако съм искате да съхранявате двама студенти? Така че първият ми инстинкт се случва да се оправи, чакай малко, ако имам друг студент, защо не мога да просто правя низ име 2, низ общежитието 2, инт ID2. И сме направили изчезна по този път преди и какво е нашето решение да това, което изглежда да бъде нещо като hackish копие паста работа тук? АУДИТОРИЯ: Масив. DAVID J. Malan: Да, бихме могли да използваме масив. Точно това много бързо става тромаво. Трябва да сортирате на произволно започне именуване всички тези променливи. И вие, човекът, трябва да се запази песен, която OK NAME2 съответства с dorm2 кореспондира с ID2. Тя просто се превръща в каша. Така че това е много по-лесно, извикайте от преди няколко седмици, просто да се налага да се наричат ​​имена струнни а може би и да ни даде три от тези. И тогава може би имаме струнни общежития и имат три от тях, или с постоянна, INT документи за самоличност и има трима от тях. Но дори и сега това се чувства малко помия, нали. Ние говорим за студенти и още Аз съм наистина жилище на много ниско ниво подробности по изпълнението. Ученикът е име и общежитието и ID. Защо не мога да просто да декларира променлива наречено студент и се обадете това е. И ако искам друг студент, защо не мога просто да го наричаме т. Или ако искам цял куп на студенти, защо не мога просто кажем, че имам цял клас учениците, и това е три от тях. С други думи, защо да не мога да дойда с моя собствен тип данни, наречен Студентите, вътре в което е име, е ID, е общежитието, е произволен брой други области. И се оказва, можете може да направи точно това. Така C има тази функция, наречена структура на. Това е функция, език, ни позволява да направите точно това. Отивам да се продължи напред и да се отворят structs.h къде отиваме, за да видите следната дефиниция на един студент. Оказва се - и това е още една лесно, отколкото този, който включва ID преди малко. Ако искате да излезе с Вашия домашен тип данни, и в допълнение към INT и Чар и плува и всички тези други хора, които съществуват, можете да го направите, като буквално написването typedef структура на, тогава някои фигурни скоби, вътрешността на която сте списък на променливите, които искате да асоциира с този нов потребителски данни Типове като име и общежитието, и след това, след като фигурните скоби можете да дадете име на новия тип данни. Така, например, студент. И това, което е хубаво за това е, че сега ако погледнем на съответния код, конвенцията, първа от всички, е да се сложи това във файл, наречен нещо дот ч, заглавния файл, който ние не сме Започнах да използвам себе си твърде много. Но ние ще започнем използвайки доста малко сега. И какво можем да направим с този, в крайна сметка, в тези няколко реда код се декларират точно това тип данни, студент. А сега нека да го използвате. Отивам да отидат в предприятието файл, наречен structs1.c. И нека да разгледаме по- Няколко характеристики тук. Така че нещата тук е най-вече познато, и ние ще се върна към това, което не е запознат в един момент. Това, разбира се, включително моята собствена заглавния файл, който е нов, както и, с изключение на PSet 3, където, изземване, имаме helpers.h. Така че можете да си спомните, #include helpers.h. Защо обаче използвам кавички вместо ъглови скоби? Кога ще избира между тях? Почти винаги аз като че ли да се използват ъглови скоби. И тогава, изведнъж върху Онлайн шест Аз съм с двойни кавички. Защо, че може да е? Да? АУДИТОРИЯ: [недоловим] DAVID J. Malan: Това е едно действително, какво от това? АУДИТОРИЯ: Това е във вашия IDE. DAVID J. Malan: Да, това е в действителност ми IDE. И нека не се спирам на специализираното логическо устройство, тъй като това е само един инструмент, който аз съм с помощта. Това е в моя ток директория, специално. Така structs.h е моя файл не е инсталирано в IDE, в самата операционна система, по-скоро тя е в сегашната си директория. Така че конвенцията е, ако искате да включи свой собствен файл с глава, можете просто да използвате двойни кавички. Какво наричаме това нещо в линия 8, най-общо казано? Това е, което? #define нещо. Това представлява константи, нали? Ако искате да имате стойност във вашата програма че използвате цяло куп пъти, това е добър конгресен да го фактор се, тя декларира, със символа на хеш дефинира, а след това, по силата на споразумение, във всички главни word-- макар че той не е абсолютно необходимо, но това е човешка конвенция да се възползва константи така че те да скочи към вас visually-- пространство и След това стойността, която желаете да бъде еквивалентен на име, което постоянно се. Не запетая, но вие просто следват този модел има. Така че това, което правя аз в тази действителната код. Така че нека да разгледаме най- основната програма тук. В ред 12, защото аз са включени structs.h, Сега имам магически ми обезвреждане на нов тип данни. Аз не просто да имат достъп до инт, Чар и и плувка, и низ, и синьо и др. Аз сега имат достъп до тип студент данни. Така че в ред 12, аз съм в смесването на две ideas-- един тип потребителски данни и две, използване масив. И така, в тази програма, ако Искам да всъщност подкрепят три различни ученици в моята програма, I може просто да се каже, дайте ми една променлива наречени студенти, всяка от които е на студенти от типа, които е моят тип потребителски данни. И по-конкретно, дай ми три от тези в моя масив. Така че сега, какво ще правим в тази програма? Ето само един цикъл за итерации 0-3, защото това е каква е стойността на студентите. Аз съм просто подканване на потребителя дайте ми име на студента. И след това в ред 17, ние имат най-вече запознати линия. Ние разполагаме със стар приятел GetString отдясно. И каква част от синтаксиса очевидно е нова, ако никога не сте програмиран в C и преди, и никога не са използвали structs? Да? АУДИТОРИЯ: The .name. DAVID J. Malan: The .name. Но това не е твърде много на скок, защото сега учениците скобата аз дава-тото студент. А ако искате да се потопите вътре в тази структура, можете просто да използвате един период и След това името на променливата вътре, или имуществото вътре, че Искате ли да получите достъп до. По същия начин след това, ако след това да подтикне потребителя, дай ми в общежитието на студента, можете да съхранявате по подобен начин, че низ в променливата на общежитието вътре на тази студентка структура. И сега нещата стават малко фантазия. И това ще изглежда най-вероятно много съвсем скоро. Но вие ще видите това в много по-PSet 4, така че нека просто си поглед към него сега. Оказва се, че в съответствие чрез 23 38, какво мислиш, че аз съм може би правиш? Аз бях отстранен коментарите за днес, но версията на кода на линия за препращане има всички коментари. Какво ми изглежда да се прави? АУДИТОРИЯ: Спасяването на файл с всички информацията, че потребителят влезе. DAVID J. Malan: Да, точно, това е нов начин че ние виждаме две, Друга особеност на С, с което мога да създавам собствени файлове. До този момент почти всяка програма което сте написали е без гражданство. Веднага след като това е направено в ход, това е всичко. Няма по-памет или спомен за него. Няма по-файл, записан. Но ако искате да спести вход, който има случило, като в игра или програма като това, оказва се, можем да го направим. И вие ще видите това по- в PSet 4 и в раздел. Но тази линия 23 по същество създава файл, наречен students.csv. И може да си видял това и преди. Дори ако никога не съм учил CS преди, CSV е разделени със запетая променливи. Това е като един много беден човек версия на файл Excel, което означава, че може да бъде отворен в Excel и в Apple Numbers, и тя има редове и колони. Но това не е патентован формат като Microsoft или Apple. Това е само запетаи, разделящи ценности, които ще видим в един миг. И просто да вземе предположение. В съответствие 23, в самото край, вторият ми аргумент към тази нова функция, наречена е отворен за отваряне на файл е w Какво може да се обозначи w? Да? АУДИТОРИЯ: Тя ви позволява да пишете на файла? DAVID J. Malan: Тя ви позволява пишете до преписката. Така че има няколко варианта че можем да се включите тук. Но ако просто искате да прочетете файла, който е го погледнете и да го прочете в паметта, можете просто използвайте цитат цитата "г". Ако искате да пишете на файл, можете да използвате цитат цитата "w". Има също така добави и Няколко други неща ако искате да модифицират съществуващите файлове. Сега ще продължим да виждаме това нещо, а след това ще се върнем към ред 24. NULL, оказва се, е особена стойност, които могат да бъдат върнати от определени функции ако нещо е отишло wrong-- ако файлът не съществува, ако сте изчерпване на паметта, или един куп други грешки. Но за сега, нека просто да приемем, че това е само конвенционалната проверка за грешки. Тук, в ред 26, аз съм итерации 0-3 над всички мои ученици. И това е вид сортиране на нова функция, fprintf, но просто приемете предположение. Ако ФОРМАТ е само за печат форматиран низ, какво fprintf вероятно означава? АУДИТОРИЯ: Печат във файл. DAVID J. Malan: Отпечатайте форматиран низ във файл. Това е, което допълнителното е средство е файл. И новата Първият аргумент трябва да бъде променливата, която представлява вашия файл. Тогава ние просто трябва формат низ точно като ФОРМАТ. И въпреки, че това синтаксис е ново, това просто означава включете името на ученика, плъг-ин студентското общежитие, а след това с fclose, затворете файла. И тогава lastly-- това е ново и ние ще се върнем към този преди long-- съм освобождавайки студентът по причини, което се е случило до горе там. Но ние ще се върнем че преди да long-- това е, защото за това как е GetString всъщност работи под предния капак. Така че нека да хвърлим един бърз поглед тук. Ако изпишете ли в моята директория, забележите, че аз не правя има файл наречен students.csv, просто не съществува, не съществува. Така че, ако сега се съберат тази програма, направи structs-1,. / structs-1, и аз ще отида напред и да напишете в Andi, който живее в Бъркли в Йейл. Отиваме да имат Rob които живее в Тейър тези дни. И нека да излезе с къде е, аз мисля, Мария е в Mather, ако си спомних правилно. Така че нищо не изглежда да се случи. Но ако пиша ли сега, има students.csv. Да вървим напред и отворена students.csv. Това отново е много лек файлов формат. Но аз съм просто прие конвенция че имам две колони и редове тук. В първата колона е Първите имена на хора. Втората колона е на ученика общежитието, или колеж, или къща, или какво ли още не. И сега съм спасен този постоянно във файл. Така че това не е всичко, което интересно. Но това е само трамплин сега да е в състояние да задържи информация постоянно. Така че нека да видим сега какво повече можем общо с тези и други възможности. Но първо, някакви въпроси? Това беше много, и това беше бързо. Но вие ще видите много повече в PSet 4, както и. Да? АУДИТОРИЯ: Има ли начин да се продължите с добавянето на имена към този файл? DAVID J. Malan: Добър въпрос. Има ли начин да се продължи добавяне на имена за този файл? Да. И, всъщност, ако до края до повторното отваряне на досието, трябва да използвате цитат край на цитата "а" за прикрепя, които само ще добавя нов ред, а нов ред отново и отново, точно. Добър въпрос. Други въпроси? Да? АУДИТОРИЯ: Ако се завтече програма отново точно сега, ще го поддържа добавянето на имена на файл или да го отворите нов файл? DAVID J. Malan: А, добър въпрос. Ако отново дясното сте стартирали програмата Сега, може би въвели в нови имена, ще го добавите към файла или презапишете файла? Последният, защото аз съм не се използва за добавяне на готовност. И тъй като аз съм просто сляпо отваряне на досието за писане, това е просто ще презапише файла. Така че аз наистина ще трябва да направите, е да добавите, ако искам да всъщност имат дългосрочна база данни. Сега CSV е полезно, честно казано, дори за подобно ако сте writing-- и ние в крайна сметка ще видите този по-късно през семестъра, когато ние използваме CSV файловете за други цели. Ако искате да съхраните всички хора които са регистрирани за някакво събитие, или се регистрирали за вашия ученик група, или нещо подобно, съхраняване на данните в този вид на формат е супер удобно. Защото буквално, ако аз бяха да свалите този файл. Можех да double-- и нека действително опитайте тази ако имам Excel или Numbers тук. Отивам да кликнете с десен бутон или контрол, кликнете моето досие. Опа. Щракнете с десния бутон или контролния бутон на мишката върху файла ми. Хайде, мишката ми не е оказал съдействие. Download-- Отивам да изтеглите всички файлове тук, така че само за да мога да вземете тази. И нека да видим дали това работи students.csv-- първи път Аз съм активен. Сега те искат да видят моите контакти. Сега, аз трябва да се регистрирате. Вижте колко лесно е да се използва CSV файловете? Да, тя поддържа актуален. Добре, сега сме готови за клас. OK, ох, какво е новото? OK, в близост. Това беше магически. OK, сега трябва да се актуализира. И сега, той е забравил какво подаде Аз първоначално отваряне, но това, което A-- там отиваме. ОК, така че сега имаме един файл Excel. Благодаря. ОК, така че това, което направих беше най-лесната част. Разбира се, че може да са предварително инсталирани Excel, или Numbers, или каквото и програмата. Но това е хубаво, защото Сега мога да се манипулират данните в стандартен формат. Контекст Така че нека сега превключите на къде сме стигнали Последния път, който е трябвало да започне да се сваля да излети за обучение колела. Но първо, че не си виж това по-рано обяд отново се случва тук при пожар и Ice в Кеймбридж, Sitar в Ню Хейвън. Регистрирайте се на уебсайта CS50s ASAP да се присъединят към студентите и персонала CS50. Така че ние взехме обучение колела в понеделник, както follows-- низ е обявен в CS50s библиотека за известно време. И това е хубаво, защото позволява да се говори за променливи като пълни думи и изречения и др. Но се оказва, низ не съществува. Това е просто синоним, или псевдоним, че сме създали нещо, което всъщност е малко по- техническа нарича Чар *. И наистина, видяхме един пример на програма в понеделник които не се държат съвсем както очаквахме. Това е файла, да сравните-0. И припомни, че сравнявате-0, ако I прекомпилирате програма в понеделник и тичам сравнявате-0 и напишете майка в с малки букви, и майка с малки букви отново. Програмата аз настоявах написали различни неща, въпреки че майка, всички в с малки букви, е идентичен визуално. Така че това, което е най-краткият отговор защо компютъра си мисли, тези две струни са различни? Да? АУДИТОРИЯ: [недоловим] DAVID J. Malan: Точно така. Така че, мамо, за първи път Аз го напишете в, се е съхраняват някъде в моя компютър памет, но на различно място от втория път, когато въвеждате в майка. Сега тя със сигурност може да бъде оптимизирана. Компютърът може да бъде умен и реализирането на тези две струни, хей, те са идентични. Нека не излишно да го съхранява. Но компютри не правят това оптимизация, освен ако не им кажа да. Така че, по подразбиране, те са Просто ще се окажете в две различни места в паметта. И така, за да бъде по-ясно, когато ние спрямо двете струни, Първият бе наречен S, Второто беше повикан тон, какво конкретно е I сравнявайки тук на ред 13? Да. АУДИТОРИЯ: Това е мястото в паметта че променливата ще посочим. DAVID J. Malan: Точно така, аз бях сравняване на мястото в паметта че тези променливи посочили. Така че специално, ако мама е най- байт номер 1 и 2, и 3, и 4-- защото помня наклонената черта 0 трябва да е чак в края. И друга инстанция на мама, м-о-м, беше на адрес 10, 11, 12 и 13. Бях се сравняват 1, това е адресът, това място в паметта, срещу 10, което е очевидно не е същото. 1 е 10. Така че това е хубаво това, че това е доста ясен. Но това е проблематично, доколкото ние не можем да сравнявате струни. Така fundamentally-- и при това ниско ниво, ако искаш да приложат програма за сравнение две отделни думи, че потребителя е въведена за качество, направя те се подредят Чар за Чар, само в общи линии, какво трябва да направим, очевидно? Това не е достатъчно просто да се погледнете тези два адреса. Какво трябва да направим? Да? АУДИТОРИЯ: обхождане чрез стринга [недоловим]. DAVID J. Malan: Да, нека превъртите през низ. Нека да се използва за цикъл, а по време на цикъл, или каквото и да сте най-комфортно. И ако ние имаме две струни някъде в паметта, нека да разгледаме всеки си Първият символ, след това всеки е втора характер, а след това трето, и четвърто, и пето, докато не се удари какви специални страж качество? АУДИТОРИЯ: [недоловим] DAVID J. Malan: Да, наклонената черта нула, като в този момент и в двата низа можем да решим това е всичко. Били сме съвпадащи всеки един герой? Ако не е, върнете фалшива. Ако е така, върнете вярно. И така, това е точно това, тази версия на програмата за сравнение-1.В прави. То е идентично на това, което ние погледна понеделник, освен че съм отървали на думата string-- макар че не разполага с функционална impact-- всички Правя сега е премахване някои визуални колела за обучение, но да се види ясно, че ите и т са адреси. И това е, което звездата, звездичката, представлява е на един адрес, иначе известни по-технически като показалка. Така че, когато аз декларирам лидер на Онлайн 9 и казват Чар * ите, това не означава, дайте ми низ. Това означава, че, дайте ми една променлива, чиято цел в живота е да се съхранява на адрес. Защото аз съм на път да постави адрес на низ в нея. И наистина, GetString, да бъде ясно, не се връща низ. Той не се връща майка наклонена черта нула, само по себе си. Какво означава GetString конкретно и точно се върне? АУДИТОРИЯ: [недоловим] DAVID J. Malan: адрес, адрес на първия знак в някои низ го е намерила. И така, сега ние виждаме специална дума отново. А, аз споменах за това по-рано. Това ще бъде добър конгресен че ще видим отново и отново сега. Аз съм проверка, за да се уверите, че ите не е нищожна и т не е нищожна. Защото на базата на моя наистина Бързо се споменава по-рано, това, което може да означава, ако не се връща GetString адрес, но N-U-L-L, което е отново, някаква особена стойност? АУДИТОРИЯ: Error. DAVID J. Malan: Това е грешка. Нещо се обърка. И това, което обикновено може да се случи, особено с strings-- която може да бъде с неизвестна дължина в advance-- може би компютрите " на паметта, може би Въведеният от вас по такъв дълга дума или изречение или поставили такъв огромен есе там не е просто достатъчно памет. И така GetString не може да върне адреса на цялото това нещо, така че просто се връща нищо. И той казва грешка се е случило чрез връщане на специална NULL стойност. Това е адресът на нула, така да се каже. Сега се оказва, C идва с функция, която прави това итерация. Ние не трябва да се приложи това с а за линия или линия, докато самите себе си. Ние можем да използваме функция, нарича накратко, разбърква съединение, или низ за сравнение, чиято цел в живота е да се направи точно това. Можете да го дам две насоки, два адреса, и тя ще отиде в тези адреси и след това да сравнявате писмо за писмо за писмо за качество, спиране само тогава, когато това, което е вярно? Когато интуитивно трябва да се разбърква комп спрели итерации, само за да бъде ясно? Когато го удари обратно наклонена черта 0 и в двата низ, в който момент да може да реши е всичко, съвпадащи или не е имало разминаване? Така че, ако ще свършим това сега и се опитайте нашата малка капитализация игра, така че се сравни-1, ./compare-1, и Типове майка с малки букви и двата пъти. Сега това е едно и също нещо. И ако аз го направя отново с с малки букви и след това може би с главни букви. Сега той наистина отличава между главни и малки букви. Така че не всичко, което трудно или магическа, но тя не сега обясня какво се случва под капака на двигателя. И така, какво повече може да се извлече от този вид урок? Така че нека да погледнем на това. Отивам да вървим напред и да напише бърза програма тук нарича копие-0. А сега нека да вървим напред и действително нека да направим this-- с копие-0, да погледнем какво имам тук. За първи път съобщите на потребителя, кажи нещо. Тогава аз се низ и аз го съхранява в с. Тогава аз се провери дали е равнява се равнява на NULL, просто се върнете 1. Така че това е само стандартна проверка за грешки. Нищо интересно се е случило. И всъщност, ако се отървем от грешката проверка, това изглежда като една седмица код в момента. Но аз бях започнал да се получи малко по-добре за това. Сега в ред 16, преди една седмица, може би дори няколко дни или минути преди, може да се каже линия 16 е създаване на променлива, наречена т и копиране е в нея. И това е напълно разумен храна за вкъщи. Но по-точно сега. Какво се случва в ред 16? Какво става копиран от дясно на ляво? Да? АУДИТОРИЯ: Е т получаване на адрес на лидер? DAVID J. Malan: Точно така, т е получаване на адреса на лидер. Така че, за да бъде ясно, сега, ако отида обратно към този по-ранен пример и аз изтегля нещо, което сте въвели инча И това, което сте въвели in-- тук е лидер, а тук е това, което сте въвели в някъде в памет, мама и след това обратно наклонена черта 0, което се прибавя за мен. Това, което се съхранява в тук, припомни, това е място в 1, 2, 3, 4, това е, което е в момента в с. Така че, ако по линия 16, аз казвам, дайте ми друга променлива, наречена т и магазин в по стойността на S, което получава съхраняват тук не ще майка а само броя 1. Така че, ако ние гледаме напред в тази програма Сега, какво ще се случи? Така че забележите, че има тази функция може да се използвахме това преди известно време, за Цезар, или Vigenere, или може би не на всички. Твърдя с моя ФОРМАТ, аз съм Ще се акцентира копие Т. Първо в ред 19, бърз здрав разум проверите, strlen проверки дължината на тон. Защото аз не искам да се се опита да се възползва нещо Ако няма низ там. Ако потребителят просто да натиснете Enter, няма какво да се възползва. Така че аз не искам да правя линия 21. Така линия 21 се капитализират която писмо, както изглежда, в т? АУДИТОРИЯ: m? DAVID J. Malan: Изглежда като че ли е копирането коя? АУДИТОРИЯ: m. DAVID J. Malan: Uh, т. Добре, така че първото т, защото забелязах, че аз съм преминаване към toupper, които ако никога не сте го виждали, че е само функция за капитализират като своя принос. т скоба нула означава даде ме на нула характер на тон. И така, как става това промяна на картината, за да бъде ясно? Това, което трябва да се пренаписва или променена по отношение на лидер и т и майка наклонена черта нула. АУДИТОРИЯ: [недоловим] DAVID J. Malan: Да, така този тук просто Необходимо е да се преоблека to-- определи this-- Необходимо е да се преоблека в капиталово m. Но сега, погледнете по-късно в програма, ако разпечатате ите и т като почистя тук, да гледате това, което е ще се случи отпечатване ите и т. Така направи копие-0, ./copy-0. Нека да вървим напред и да объркат в майка във всички малки букви. Забележете, както на оригинала и копието са капитализирани. Защо? Е, а и т са както сочи, ако щете, на същия парчето памет. И честно казано, това е все Наистина uninteresting-- факта, че ние сме с помощта на адрес нула тук. Искам да кажа, че не ми пука когато нещо е в паметта. За съжаление аз съм изтриване твърде много. Но аз не ми пука където нещата са в паметта. И така, това, което наистина програмисти са склонни да мислят за е, че когато се говори за адрес или показалец, на кой му пука, когато е в паметта. Не ме интересува дали това е най- Байт за един или един милиард. Аз просто се грижи, че това променлива е ефективно сочеше, че парче от паметта. И така, отсега нататък, а не игра на думи над произволни адреси на паметта, нека Просто започнете да изготви насоки като указатели, като стрели. Така че това, S и т наистина са, съгласно тази програма, защото за това как съм създал тона, това е само на две отделни променливи сочейки в същото парче на паметта. И не ни пука къде са те. Така че ние можем абстрактно далеч тази подробност. Така че как мога да поправя това? Ако искам да напиша версия на копието програма, която всъщност копия низа и капитализира само копие, просто интуитивно, това, което трябва да е едно съставка за нашето решение? АУДИТОРИЯ: [недоловим] DAVID J. Malan: Нуждаем се от какво? АУДИТОРИЯ: парче от паметта. DAVID J. Malan: Нуждаем друго парче от паметта, нали? Ние не знаем как да го направя, все още, е задължително. Но някак ми се наложи това да се случи така, че оригиналната майка с малки букви завършва с това, че допълнително парче от паметта. И тогава, когато сменя копието, I не искам да се промени това копие тук. Аз вместо да искате да промените само това копие, така че оригиналът е непроменена. Така че, нека да видим как можем да направим това. В копие-1, която вече има е лишен от мнението си, но се коментира онлайн. Ние вместо да вършат тези following-- линии са еднакви, да ме низ и се обадете това е. Но сега нека да разгледаме един от нашите най- сложна, но последният от сложността за известно време, ред 16 прави точно това. Така че, ако си удобен с картина ние просто drew-- дайте ми ново парче от паметта, копирате всичко в нея, Нека да видим как можем да превежда, че код. Така ред 16, от лявата страна, Чар * т ми дава това поле тук. Това е всичко, го прави. От дясната страна, м АПос, или изчистване, е заделяне на памет, супер луксозен, загадъчен начин просто казвам дайте ми парче от паметта. Колко памет се нуждаем? Е, е един вид голяма изява. Но нека да видим какво пише тук. Така че това, разбира се, е да даде ме дължината низ от лидер. Така че, майка трябва да е какво? Така че само три, нали? Майка е на три знака. Вие не се броят на наклонена черта нула, когато говорим за дължината на низ, че е всъщност човешките видими букви. Така майка, така че това ми дава 3. Но почакайте, аз съм сега добавяйки 1. Защо всъщност искате да разпредели 4 байта, а не само 3? Да? АУДИТОРИЯ: За стойността караулната? DAVID J. Malan: Точно така, за тази страж стойност. За наклонената черта нула, Имам нужда от 4 байта общо. Така че аз трябва дължината на низа плюс 1. И след това просто за добро measure-- въпреки че тази система, тя винаги ще бъде 1-- Казвам умножи тази от размера на Чар. Оказва се, че е sizeof оператор в C, че Просто ви казва брой байтове, че е се изисква за определен тип данни. Тя не работи за масиви, обикновено, понякога го прави. Но в общия случай, не. Но това ще ми каже колко байта а Чар е, което се оказва винаги е 1. Така че това е като се умножи по 1. Така че супер загадъчен търсите ред код. Но всичко, което прави е дава ми парче от паметта. Но пък изглежда да се копира нищо в този спомен? Все още не. И така, това, което правя по линия 22, както и 23, 24, 25, добре, аз просто правя това. И това е нещо старото училище неща сега. Това е като PSet 2, където вие просто се движат нещата наоколо в паметта, или по-скоро в низове. Така че аз съм итерации от 0 до дължината на низ те години. И аз съм копиране-тото характер в сек-тото герой в т. И тъй като аз, програмист, изработен забравяйте да разпределят точно както много байтове като имам нужда, той е перфектен едно към едно правоотношение. И аз копирате майка в малки букви на новия. И след това на последно място, аз правя тази линия. И така, ефектът е само да капитализира този тон тук. Така че какво да абсорбира, но ако просто помисли за това, което наистина се случва за под предния капак просто се движат тези байта се, че всички е необходимо да се реши този проблем е само за да ни даде това парче от паметта. Сега с риск преобладаващото, позволете ми да се покаже един друг пример, че е почти идентични, с изключение на този ред код. Така че това е хакер версия на тази програма, ако щете. Но нека просто дестилират то в това, което се случва. Line 24 трябва да бъде по този тон скоба аз стане лидер скоба аз. Сега, аз съм това да се променя на много по-загадъчен звезда тон плюс 1 е равно на звезда и плюс 1. Така че това, което се случва и защо имаме една звезда характер? Видяхме звездата и преди, и това е да се използва по различен начин тук. Ние вече видяхме Чар *, сега аз виждам звезда в началото, и това е ОК. Защото се оказва, ние може да се направи извод, просто вид от тези, които първи принципи какво става. Така че просто да е ясно, какво е лидер? Миналата седмица тя беше низ. Това не е достатъчно вече. Какво е и, по-конкретно? АУДИТОРИЯ: [недоловим] DAVID J. Malan: Това е една показалка. Това е адресът на Първият знак сме написали инча OK, това, което е т? АУДИТОРИЯ: [недоловим] DAVID J. Malan: The адреса на първия байт в т, че парче от паметта преразпределени. Така се оказва, че когато сме обхождане от 0 за до низа length-- на първо място, аз започва при 0, защото на този стар училище за контур нещо. Така че просто за простота, нека Предполагам, че на първа линия на код наистина е само това, нали. Ако аз е нула, нула добавяне към нещо вероятно няма да има ефект. И така, какво е тая дума? Оказва се, че звездата оператор в този контекст е сочен Операторът, който е само на един луксозен начин на казвайки отидете на следния адрес. Така че, ако S е адреса на първия характер в този парче от паметта, * ите средства отиват там. И тъй като ние сме изготвен на снимката по този начин, можете да приемете следния мисловен модел. Ако това е лидер, а вие казвате * е * е, нещо като улеи и стълби, ако си спомняте играта от детството, е като се следват, че стрелката и да отидете на адреса. * т е едно и също нещо. Така че започнете тук, отидете на неговото парче. Не мога просто да се възползва от този екран по този начин. * т означава да отидете тук. И тогава, на линия за е просто казвайки движи този герой тук, преместите този герой тук, преместите този герой тук. Но как мога да направя това нарастване На? Имам нужда да отмените това, което аз просто заличава. Това е това, което обикновено се нарича показалка аритметика, която означава математика с адреси. Ако в тази линия за, Продължавам увеличаване аз, и лидер е адрес, и т е адрес, ако просто поддържа добавянето на 1, това просто означава, продължи да се движи напред, и напред, и напред в паметта. Това е като Oxford Street, на улица че сградата CS е включен. Сградите CS е в размер на 33 Oxford Street. Така че, ако ви се налага да правите 33 Oxford Street плюс 1, че ви носи до 34 Oxford Street, след това 35 Oxford Street, След 36 Oxford Street, каквото и тези, сгради всъщност са - ако има такива. И така, това е всичко, което правим тук с показалеца аритметика. Така че това е супер тайнствена начин да изразят себе си. Но всичко, което се случва под капака е точно след тези адреси, като след една карта, ако щете, или след като стрели установили сме на екрана. OK, много да бюлетини. Всеки въпрос относно синтаксиса, концепции, указатели, изчистване, или други подобни. Да, тук на първо място. АУДИТОРИЯ: Така че, когато това казва * т равнява toupper * т, е, че ще да се акцентира всички букви или just-- DAVID J. Malan: Ах, наистина добър въпрос. Така че в този ред тук, 31, е това щеше да се възползва първата буква или всички от буквите. Така че нека да отговоря на този въпрос, като отидете назад към първите принципи. И първите принципи тук искам да кажа Просто отидете на основните определения на какво става дума. Така toupper е функция което се капитализира Чар. Това е всичко. * т означава отидете на first-- отидете на адреса в т. Така че, на снимката, ако това е парчето памет ние разпределят с изчистване, и това е т, т * означава, отидете тук. Междувременно, можете да започнете, минаваща тази стойност, с малки букви м да toupper, вие получавате обратно капитали M, къде да я сложите? Можете да започнете да я постави в същата локация. И така, като че логиката на тези, основни дефиниции това е само капитализиране на първата буква освен ако не сте с обхождане аз или за линия или линия, докато това не се случва да направи нищо повече, отколкото сте предполагали попитам. Добър въпрос. Да? АУДИТОРИЯ: Защо го използвате сочен начин, а не масива? DAVID J. Malan: А, добър въпрос. Защо да използвате вземане на адрес метод вместо метода на масив? Не конкретна причина, за да бъдем честни. И в действителност, за тази вид например, нали, Аз съм просто твърдейки вкара Програма по-сложно, повече очи са пломбирани свърши, хора, напускащи защото това изглежда супер тайнствена, но макар и да прави едно и също нещо. И така, честно казано, това е ненужно визуално комплексно решение на проблема. Тя все още е добър дизайн, пет от пет за проектиране, независимо дали това е в скобата бройна система или нотация на показалеца. But-- особено когато стигнем по-късно в хода на PSet 5 когато ние прилагаме, че речника, че Аз споменах няколко times-- ние всъщност ще се грижим за ниско ниво на адреси на паметта че можем наистина да разберем какво става. Но, за сега, се оказва, че този ред код тук квадратни скоби наистина не съществува. Те са това, което се нарича синтактична захар, която е просто странно готин начин да се каже на съставител конвертира квадратни скоби, за да бъдат че математически израз. Така че това е една човешка конвенция да бъде в състояние да просто напишете тези много лесен за употреба скоби. Но това, което компилаторът, трясък, е наистина прави всяко време ти пиша това, което се подчертава в съответствие 24, намираща се под капака това е наистина превръщането на това. Това е просто по-приятен като човек да четат и пишат код като линия 24. Но в крайна сметка тези, обучение колела твърде излизам когато собствената комфорт стане по-силен. Добре де, спомням тогава, че това беше от най-големият проблем ние се блъсна в. И това е, което предизвика цялата тази дяволите разговор за указатели, и адреси, както и копиране на нещата. Това е така, защото ние се препъна този глупав, глупав въпрос, при който I реализира logically-- с Лорън до тук, на демото и портокалов сок в milk-- напълно алгоритмично правилната функция за прехвърляне на две променливи " ценности, но проклетото нещо не са имали всички устойчиви, или постоянно, ефект върху моя код. И защо беше това? С две думи, защо е това изпълнение на суап логически правилно, но не оказва влияние на променливите, които се предават към него, като х и у за главната? Какво е същността на проблема? Да? АУДИТОРИЯ: Защото променлива прави копия на променлива в прохода чрез функция. DAVID J. Malan: Точно, когато минаваш променливи в дадена функция, или доводи в дадена функция, те са приет от копие, което означава, че получавате идентичен търсите модел на битовете за х, така и у, наречен тук и б. И вие можете да правите нищо искате с тези копия, но те ще имат не осъществяване на викащата функция. И, всъщност, ние привлече, че снимка на екрана, изземване Последния път, при което, ако Наистина мисля за това, което е става под hood-- ако това е паметта на компютъра, и тук е парчето памет се използва за основна, това е парчето памет се използва за замяна, и така, дори ако основната има две променливи, х и у, суап може да има еднакви търсите ценности, и двете от които са 1 и 2, но те са напълно различни части от паметта. Така че ние се нуждаем от решение на този. И честно казано, изглежда, че ние сега има решение на този проблем, нали. Ако ние сега имаме възможността да манипулират неща по пътя на адреси и, сортиране на улеи и стълби стил, следвайте тези стрели и отиде навсякъде искаме в паметта, ние не можахме да решаване на този проблем, като преминаване от главния да сменяте Не ценностите, които искат да суап, но просто интуитивно това, което бихме могли да мине вместо да сменяте? [Вмъкване VOICES] DAVID J. Malan: Защо да не направим ние просто да го давате на адресите, нали? Защо не даде суап за карта на съкровище, ако щете, че то води до действителните стойности х и у. Нека суап, действително се промени тези оригинални бита, вместо просто преминаване копия на битовете. И така, в действителност, това е, което е ще бъде решение. Тази версия е тук ясно лошо и недостатъци. И сега, на пръв поглед, той просто изглежда като ще добавя куп звезди на случаен принцип и кръстоса пръстите ни че ще се съберат. Но, сега ще се съберат. Но нека да видим какво означават тези неща. И, за съжаление, авторите на C би могъл да избере друг символ да направи това малко по- по-ясна, но операторът на звезда има различно значение в два различни контекста. И сме виждали и двете, но нека да се прави разлика. Така в горната там, когато са се променили а и б от INT е в лошо Версия за INT звезди, а и б, Преди това са цели числа. Какви са а и б сега в доброто, зелена версия? Те са адреси. Адреси на какво, да бъдат ясни? Адреси на цели числа. Така че това, че аз съм казвайки инт звездни средства Това е адресът на цяло число, по-специално. Така че сега забележите в редовете на кода, нещо друго се е променило много. ТМР остава същото, тъй това е просто временен цяло число, Няма магическа памет там. Но сега се нуждае от звезда. И в действителност всеки друга споменава а и б, забележите, че всичко, което е променя от червен на зелен е, че аз съм префикс тези променливи със звезди. Защото аз не искам да копирате и б. Защото, ако аз просто копирате и б и суап а и б, аз какво всъщност смяна? Само на адреси, които искам да сменяте това, което е най-тези адреси. Искам да отида там. И така, операторът на звезда вътрешността на моята функция, не вътре в списъка на параметрите, означава да отидеш до тези адреси и действително променят тези стойности. Така че това, което прави картината Сега изглежда като вместо това. Е, ако вместо това аз съм минаваща в за А и В не една и 2-- Аз всъщност трябва да добавите едно друго определение тук. Така че предполагам, че това парче на паметта е в населено място 10. Това е в място 11, но този е малко на опростяване, Сега имам два избора направя минавам х и у или да прехвърлят своите адреси? Ако минавам техните адреси по този начин, аз просто Сега трябва да се прилагат суап на зеления код така че когато го вижда и когато тя б вижда, той не просто копирайте а и б и да се премести на млякото и портокалов сок. Сок мляко и портокал метафора сега се развали, защото това са чаши на течни и не карти. Ние вместо да трябва да отида на адрес 10 и трябва да отидете на адрес 11, и След това изпълнява тази смяна логика. Така логиката е същата, но имаме нужда от малко по-различен начин на ползване на тези променливи. И така, в крайна сметка, това, което програма трябва да изглежда така е това. В swap.c буквално копиран и поставили зелената версия. Но аз трябва да се направи една промяна. Това не е достатъчно просто да се промени суап. Какви други ред код трябва ли да се промени? Да? АУДИТОРИЯ: Когато отнема аргументите. DAVID J. Malan: Къде това отнема неговата теза. Така че, ако превъртите до основното, I Не може просто да премине в х и у, и, обещавам, последният парче от новия синтаксис днес. Имам нужда да премине в х и не Y но адреса на х и у. И се оказва, символът че авторите на C избра е, ако използвате амперсанд тук, а не да да се бърка с побитова амперсанд, ако използвате амперсанд тук и амперсанд тук, този разбере за вас, какъв е адреса на х, може би това е 10, това, което е най- адрес на у, може би това е 11, и преминава в тези вместо. Така че какво да усвои всички наведнъж. Но нека да видим сега бързо в нашите оставащите четири минути където нещата могат да се проваля. И като настрана, всъщност Взех тази снимка, TF пое тази снимка преди една година или две. Така че това е задния ъгъл на Елиът Dining Hall. Показалки са може би най-трудното тема, която ние покриваме в CS50. Така че, ако се притеснявате за нещо на наклон е като може би това е повече от стик за хокей като това, да разбере, ние сме вид наближава своя връх през от гледна точка на концептуалната сложност. И аз доведе до това снимка, защото кълна към Бога, през есента на 1996 г., когато взех CS50 с преподавателската си колега, Nishat Мехта, той ми седна в ъгъл на D. зала Eliot по време на обяд, или вечеря, или нещо, което да се опита да ми помогне да разбера указатели. И това е мястото, където бях седмици след тя е въведена в лекция, когато Накрая разбрах указатели. И аз съм с надежда, че този ще кликнете далеч по-рано за вас. Но се реализира това абсолютно наред по-сложните теми след като видяхме. Но това е сред най-силните. И когато го вземете, той е наистина всичко просто ще се най-накрая дойде заедно. Така че бъдете сигурни, че не прави Трябва да мивка в цялата днес. Така че тук е последната програма ние ще разгледаме. И ние ще завърши с следните три минути claymation направено от нашия приятел, Nick Parlante. Ето една програма, която за първите две линии декларира променлива х и у. И двете от които са адреси на цели числа, известен още като указатели. Ние след това се разпределят достатъчно памет за съхраняване на инт и съхраняване на адреса на тази памет в х. Така че, това е още по-лесно от пример преди. Дайте ми четири байта памет, това е с размерите на инт, и постави този адрес в х. Тази линия тук означава, отидете на адреса в х и сложи смисъла на живот, броят 42 там. Но този ред ме притеснява. Звезда у означава отидете на адрес в у, и сложи Нещастната номер 13 има. Защо е опасно, в този момент в story-- макар бързо каза в нашите избледнява минути here-- защо това е лошо за мен да кажа, отидете на адрес в у? АУДИТОРИЯ: не Имате [недоловим]. DAVID J. Malan: Не съм поставяйте нищо в ш. Така че това, което е стойността на у, в този момент в историята? Нямаме никаква представа. Това е някаква ценност боклук и нито Binky знам. Ако можехме да сложи край на тази бележка. [Възпроизвеждане на видео] -Hey, Binky, събуди се. Това е време, за показалеца забавно. -Какво е това? Научете повече за указатели? О, лакомство. -Е, За да започнете, аз предполагам, че сме ще се нуждаят от няколко насоки. -ДОБРЕ. Този код се отпускат две указатели който може да посочи числа. -OK, Както виждам две насоки, но те не изглежда да сочи към нищо. -Това е вярно. Първоначално Указатели не сочи към нищо. Нещата, те изтъкват, са наречено pointees и установяването им е отделен етап. -О, Надясно, надясно. Знаех, че. На pointees са отделни. Е, как да се разпредели pointee? -OK, И този кодекс Разпределя нов число pointee, и тази част излага х да говорят за него. -Hey, Че изглежда по-добре. Така че да го направя нещо. -OK, Аз ще сочен показалеца х да съхраните номера 42 в своята pointee. За този трик, ще имам нужда от моето магическа пръчка на dereferencing. -Вашият Магическа пръчка на dereferencing? Uh, че това е страхотно. -Това Е, което кодът изглежда. Аз просто ще създаде броя and-- [POP SOUND] -Hey, Погледни там тя отива. Така че, това е сочен за х следва стрелката, за да получите достъп до своята pointee. В този случай, за да се съхранява 42 в там. Ей, опитайте да го използвате, за да съхраните номера 13 чрез друга показалеца, Y. -ДОБРЕ. Аз просто ще отида тук, за да у, и да получите номер 13 набор нагоре. И след това да вземе магическата пръчка на dereferencing и just-- [BUZZER SOUND] -О, Хей, че не работи. Кажете, ъ-ъ, Binky, аз не правя мисля dereferencing у е добра идея, тъй като задаването нагоре по pointee е отделен етап. И аз не мисля, че някога го е направил. -Hmm, Добра точка. -Да, Ние разпределени на показалеца, ш, но ние никога не го настроите да сочи към pointee. -Hmm, Много наблюдателен. -Hey, Което търсите добра там, Binky. Можеш ли да го оправя, така че у точки към същата pointee като х. -Разбира Се, аз използвам моята магическа пръчка на показалеца задача. -Има, Че ще бъде проблем, както преди? -Не, Това не докосвайте pointees. Тя просто се променя една показалка да сочат към една и съща thing-- [Тракащ звук] --as друго. -О, виждам. Сега у точки на същото място като х. Така че, изчакайте, сега у е фиксиран. Той има pointee. Така че можете да се опитате магическата пръчка на dereferencing отново да изпрати 13 свърши. -О, OK, тук върви. -Hey, Погледни това. Сега dereferencing произведения на ш. И тъй като указателите споделят че един pointee, двамата видите 13. -Да, Споделяне, ъ-ъ, нещо такова. Така че, отиваме да си разменят местата в момента? -О, Да изглежда, че сме извън времето. -Но-- -Само Не забравяйте трите правила на показалеца. Номер 1, основната структура е, че имате указател, и да го посочва в съответното pointee. Но показалеца и pointee са отделни. А общата грешка е да се създаде показалка но да забрави да му се даде pointee. Номер 2, показалеца dereferencing започва от показалеца и следва своята стрела над за достъп до своя pointee. Както всички знаем, това работи само ако има е pointee, кой вид се върне да се произнесе номер 1. Номер 3, показалеца задача се взема една показалка и да се промени на точка до най- същата pointee като друг показалка. Така че след прехвърлянето, двете стрелки ще точка към същата pointee, Понякога това се нарича споделяне. И това е всичко там е до него, наистина. Чао чао сега. [END PLAYBACK] DAVID J. Malan: Това е всичко за CS50. Благодарение на професор Ник Parlante. Ще се видим следващата седмица. [ELECTRONIC за възпроизвеждане на музика]