[Музички] Дејвид Џ MALAN: Ова е како бруцош семинар денес. ВО РЕД. Па многу врнежлив надвор. Оваа тенденција да се случи во среда, но сè повеќе и повеќе можности за прашања денес. Па ајде да започнете всушност со филмот во само еден миг. Но, ние ќе започнеме grandly како и секогаш. Ова е CS50, и ова е до крајот на недела 4. Значи, ако некогаш сте се одвиваа Телевизија или филм кадешто има некои компјутерски експерти и полиција, или ФБИ, или некоја агенција се обидува да го фати некои противник, Па, сте веројатно слушнале за изразот "подобрување" при што некако техничар магично зумира во бескрајно колку да се види на криминалци карта или број на регистарска табличка дури и во трепет на огледало или трепкаат на нечие око. Значи, навистина, ајде да ги разгледаме во неколку такви сцени од Холивуд. [Видео репродукција] -OK, Сега да се добие добар поглед на тебе. -Држи го. Се кандидира тоа назад. -Почекај минута. Одат право. -Има, Замрзнување тоа. -Цел екран. -OK, Замрзнување тоа. -Tighten Основа на тоа, ќе ви? -Vector Во на таа човек со задното тркало. -Zoom Во токму тука на ова место. -со Право на опрема, на сликата може да се зголеми и изострен. -Што е тоа? -Тоа Е подобрување на програмата. -Може Да ви е јасно дека на било кој? -Не знам. Ајде да го подобрат. -Enhance Делот А6. -Јас Подобрена детали, and-- Мислам дека постои доволно да се зголеми, порака до мојот екран. -Јас Засилиле одраз во нејзините очи. -Let Е воден ова преку видео додаток. -Edgar, Може да ви го подобри ова? -Држи се. -I've Бил работат на оваа рефлексија. Рефлексија -Someone е. -Reflection. -Има Е одраз на лицето на човекот. -на Рефлексија. -Има Е одраз. -Zoom Во на огледалото. -Можете Да се ​​види одраз. -Може Да ви го подобри имиџот од тука? -Може Ли да го подобрат тука? -Може Да ви го подобрат? Може да ви го подобрат? -Може Да се ​​подобри ова? -Може Да ви го подобрат? -Hold На второто, јас ќе се подобри. -Zoom Во на вратата. -Times 10. -Zoom. -Move Во. -Повеќе. -Wait, Да престане. -Stop. Тоа -Pause. -Rotate Ни 75 степени околу вертикалната, ве молам. -Stop. Вратете се во делот околу вратата, повторно. -Got Една подобрувач слика која може bitmap? -Hey, Можеби може да се користат Pradeep Сен метод за да ја видите во прозорците. -Ова Софтвер е држава на уметноста. -на Eigenvalue е исклучено. -со Право комбинација на algorithm-- -Тој Е донесена елиминација алгоритми за да на следното ниво, и можам да ги користите за да го подобрување на оваа фотографија. -Lock На и зголемување на z-оската. -Enhance. -Enhance. -Enhance. -Freeze И да се зајакне. [END репродукција] Дејвид Џ MALAN: Добро, така сите оние кои се всушност зборови. Тие се само се нанижани заедно во начин кој не е всушност разумен. И дека, всушност, CS50 и курсеви како што има тенденција да се уништи голем број на ТВ и филмови за тебе. Затоа што кога тие се компјутерски експерти се растреперува надвор термини и велејќи: фенси нешта како вектори, и z-оската, и било кој број на други всушност, повеќе технички термини, Тие се навистина само stringing зборовите заедно сите премногу често. Е дека еден од нашите надежи е дека, како пропратен ефект на земање предмети вака, ќе се повеќе луѓе во свет, всушност ќе биде во можност да ги земат во и само некогаш толку малку да влијаат врз квалитетот и точноста на тие филмови? Всушност, ајде да ги разгледаме во реалноста. Па тука е слика на персоналот на Марија, една од нашите наставата соработници. И дека таа е осомничени за нешто. А, сепак, има трошка некои парче на докази во нејзините очи, или во одраз на нејзините очила. Па, ако тоа го правиме токму како филмовите предложи, кадешто ние зумирате и "подобрување", ова е колку информации е во лицето на Марија кога ќе направите некоја слика со таа оригиналната резолуција. И дека, всушност, може да се види овие точки. И тие се она што се наречени пиксели, Р-И-Х-Е-Л-S, што е само еден квадратен обично дека е една точка што влегува на сликата. И во тоа време, и всушност дури и денес со некои од денешните LED телевизори или LCD телевизори, и ако имаш една во вашата соба или во вашиот дом, ако одите до супер-блиску до него, и особено ако тоа е малку постара ТВ, што веројатно може да се види дури и овие точки и тоа е она што го сочинуваат сликата. И не постои повеќе информации од ова. Ние би можеле да "подобрување", во смисла на мазнење нешта одново и вид на inferring вид на, вид на она што боја треба да биде во близина на око на Марија така што тоа не е всушност толку pixelated. Но, ако јас се задржи зумирање, таму е негативец во нејзините очи. Како што е на сите информациите што ги имаме. Вие не може да креирате информации од ништо. Има само ограничен бројот на битови таму. Па во Проблем Постави 4, каде што ќе имаат можност да се игра со овој вид на светот. Проблем Постави во 4, ќе се истражуваат светот на графика, и криминолошки науки, а всушност се напише код која го обновува изгуби слики. Ќе напише код кој манипулира постоечки слики и на крајот се разбере она што е случува под хауба. И, што се испоставува, тоа е всушност не е толку комплициран. На пример, ако сакаме да претставува насмеано лице каде со овие црни точки, или овие црни точки, Па, ние едноставно може да претставуваат нив како вистински битмапа. И ако го чул дека изразување bitmap, можеби што е сега почнува да се направи Денес малку повеќе смисла. Ние веќе знаеме што малку е. Тоа е 0 или 1. И карта е само нешто како парче хартија кој ви дава насоки и има можеби мрежа на x- и y-координата. Па тука е битмапа. Тоа е мапа на битови при што 1 е очигледно ќе претставуваат еден бел пиксел, и 0 ќе претставуваат еден црн пиксел. Но секако може да го флип наоколу. Тоа навистина не е важно толку додека ние сме доследни. И тука е како, во внатрешноста binary-- меморија на компјутерот, па дури и во внатрешноста на фајл на вашиот хард drive-- би можеле да ги чувате наједноставните смешковци слики лицето. Но, она што сме ние, се разбира, во недостаток на оваа слика? Боја, нели? Тоа е очигледен следен чекор или подобрување за да се подобри ова со боја. Па за жал само со еден малку, 0 или 1, ние би можеле да претставуваат боја. Тоа може да биде црвена или сина боја, или црна или бела боја, или зелена, или розово, или било парови на бои. Но заради едноставност, ние ќе само да се претпостави црна и бела боја. Значи она што не ни треба логично ако се сакате да се спроведе на бои во сликата? Што треба да се направи? Како ако ограничувачки фактор тука е тоа што со една малку можете само да си претставуваат две држави, 0 или 1, бела или црна боја, што сакаш да правиш? ПУБЛИКАТА: Повеќе податоци. Дејвид Џ MALAN: Повеќе битови, је повеќе податоци, повеќе битови. И, навистина, тоа е точно слики во боја се претставени. Наместо да се користи еден малку, 0 или 1 за секој пиксел, секоја точка, можете само да се користи на повеќе. Можеби користите 8, можеби, почесто користат 24, а всушност, во Проблем Постави 4, ќе си играш со датотека формат, кој го користи 24 бита обично. Но, повеќето од вас се веројатно запознаени со JPEG слики. Ако некогаш сте се земени Фото на вашиот телефон, или качен или видел нешто на Фејсбук, или Фликр, било кој број на веб-сајтови фото-базирани, сте веројатно виделе JPEG сликата порано. И што излезе, ова е датотека формат, ние ќе треба да се користи во pset 4, при што ви се случува да имаат за враќање на сликите дека јас сум случајно избришани од оштетени мемориска картичка во апаратот, ако сакате. И излегува дека и покрај тоа JPEG е прилично sophisticated-- тоа е многу пософистициран од црно-бели точки видовме пред еден миг, бидејќи има всушност фенси алгоритми кои се користат за да се компресира JPEG, па што ќе може да има навистина убаво, квалитет на сликата, но со користење на релативно мал број на битови. И ние ќе се вратам на компресија пред долго. Излезе дека првиот три бајти во JPEG image-- без оглед на она што сте ги направиле фотографија of-- се вредностите, 255, 216, 255. Со други зборови, ако само види дека шема на битови, претставен тука, како три бајти, или 24 бита вкупно, со голема веројатност може да се заклучи дека ќе се гледа во тоа што оваа првите три бајти на JPEG. И тоа е она што е познат како потпис на JPEG. А многу формати на датотеки таму имаат тенденција да започнат со одредени модели на 0-ти и 1S, така што Windows и Mac OS, и iOS, и Андроид знае каков вид на датотеката од која што се, во прилог на т.н. датотека продолжување дека многу датотеки има. Ако сте .jpg, тоа е уште еден знак за компјутер. Па да сега се погледне на овој малку повеќе технички. Знаеме децималниот систем е од 0 до 9. Знаеме бинарни е 0 и 1. И ако мислите дека назад во pset 0, моравме да ви се борат со, за малку, нешто наречен хексадецимален, каде што ќе има 16 цифри, наместо 10 или наместо 2. И оние бројки, по конвенција, се од 0 до 9, а потоа и преку f, каде што f претставува она децимален број, исто како брз разумност провери? Значи, 15. И мора да го претставуваат 10, само со природата на нарачување што сум ги дал. Тоа е само еден арбитрарен конвенција, но тоа е сосема стандард. Значи, ако ние се погледне на овој модел од три bytes-- ајде само да почне да се погледне во него во на начин во согласност со тоа како компјутерски научници, генерално, погледне и да размислуваат за датотеки. Сигурно може да се размислува за слики во 0-ти и 1S, и децимални, но во реалноста, ние се стремиме да се користи бинарен или повеќе обично hexadecimal-- назад од pset 0. Значи, дозволете ми да предложи 255, 216, и 255 се само овие модели на 0-ти и 1S. И може да се провери ова, ако сакате да го направите математика од недела 0. Но, за сега, само да се претпостави дека ова е навистина точно. Јас сум само препишува три децимални број како и три бинарни вредности. Сега она што јас ќе одам да направите е да се само додадете малку бел простор, само поради читливост е. И известување, јас сум само ќе да се движат работите од друг. Па пред, по, пред, по. Јас го правам ништо интересно други од само ширење на работите надвор, така тоа известување на секој сет на осум битови сега е на две групи од четири бита. Ова е корисно бидејќи хексадецимален е особено модерен бидејќи секој хексадецимален цифрениот 0 преку f, или поконкретно од 0 до 15, може да се претстави со точно четири бита. Со други зборови, во хексадецимален ако сакаат да се претставуваат 0, тоа е само 0000, четири нули. И ако сакате да го претставуваат 15, тоа е од 1111, што е за четири бита. И ако го направите математика, дали тоа е во нивните места, ова е на 16 место, кој ќе даде you-- а што се случува to-- жал, во бинарен, кој ќе ви даде 15, оние место, twos место, четири и осмици место. Значи, дозволете ми да предложи дека поставени од четири бита на левата е она што ние ќе треба да се јавите на f. Тоа е најголемиот број што може да се претстави со четири бита. А ние веќе знаеме од хексадецимален, ѓ е најголемата цифра во хексадецимални. Имаме уште една ѓ таму, повеќе таму два. И сега за сега, само да се земе на верата дека сум се направи во право математика и на тој на левата половина од овие бајти, 1101, е истото што и г во хексадецимален. И на десната рака, 1000, е само 8. И лесно дека еден е да се види, нели? 8 represents-- е во право под кои осмици место. Па ние имаме еден во колоната осмици и ништо во четири, двајца или оние. Па сега повеќе конвенционално, луѓето имаат тенденција да се напише хексадецимални цифри, како таков, можете само да ги мачкам заедно, а потоа ќе ги со префикс 0x. Тоа не значи ништо друго освен визуелна индикација на human-- тука доаѓа хексадецимално value-- бидејќи што инаку не би можеле да бидат очигледни. Што би се рекло, во крајна линија, дека моделот на нули и единици, или моделот на хексадецимално бројки еквивалентно дека сте ќе почнете да барате Проблем Постави во 4 е this-- и проблемот Постави 4 спецификации ќе одиме вас, преку овој во повеќе detail-- но сфати како еден вид на мистериозен како ова може да изгледа на прв поглед, си оди за да започнете да гледате ова многу. И всушност, дури и во GDB, на дебагерот воведовме во понеделникот Дан и го воведува во pset 3, се случува често да ви покаже хексадецимален вредности само затоа што тие имаат тенденција да бидат повеќе конвенционалните од децималниот или во бинарна во светот на компјутерите. Сега ајде да се стави ова во контекст. Многу од вас можеби се сеќаваат на овој слика овде, кој дојде од што? Vista, па дури и порано од дека, Windows XP, го направи ова деби. Значи ова е прекрасен пејзаж. И всушност, ако ѕиркаат наоколу online-- Мислам дека тоа е една статија на Википедија, назначено со тоа, некој многу неверојатно излезе најдов оваа локација во светот постави неговите или нејзините камера токму правото place-- и ова денес изгледа like-- но тоа е потполно ист амбиент. Оваа слика, сепак, е во датотека формат наречен bitmap, б-м-р. И ние ќе треба да се земе супер брз поглед на она што значи тоа. Но битмапа е само еден поинаков начин на што претставува уште слики со користење на пиксели во 0-ти и 1S, во крајна линија. Но на прв поглед, таа има поинтересна потпис на почетокот на датотеката. Тоа не е само три бајти, а има еден куп шеми на бајти кои се однапред одредени значење. На пример, некаде во првите неколку бајти на bitmap слика се случува да биде со големина на слика, ширината на сликата, висината на сликата, па корисно метаподатоци, ако сакате. Корисни информации кои Фотошоп или било која графичка програма што ја користите всушност би можеле да се грижат. Толку повеќе за ова во Проблем во собата 4, но ова е само да се каже дека на крајот на денот сите формати на датотеки сте биле со за years-- датотеки на Microsoft Word, Броеви на датотеки, датотеки на Excel, било кој број на формати на датотеки кои би можеле да имаат некои Познато наставката на датотеката се само 0-ти и 1S под хауба. И луѓето се одлучиле она што на конвенции, какви модели на 0-ти и 1S претставуваат Word документ наспроти една датотека Excel, наспроти било кој број на други формати на датотеки. Па во pset 4, ќе имаат можност да се игра со тоа. Но, што значи тоа да имаш struct. Ова е всушност убаво segue сега во C, која има само неколку на дополнителни функции, кои ние не го погледна уште. Тоа е прилично мал јазик и еден од убави особини за C е struct. На пример, ако сте сакаше да represent-- ајде речеме, ти сакаше да имаат променлива која претставува еден студент во некоја програма. Можеби сте биле пишување на курсот регистрација програма, или јадро шопинг алатка, или нешто слично. Кои се делови на податоци врска на ученикот кои доаѓаат на ум? Како студент е претставени со она што сака? Да? Имаш име како студент. Што друго типичниот студент има? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Значи, жалам. ПУБЛИКАТА: доба. Дејвид Џ MALAN: возраст или роденден еквивалентно, Да. Што друго? ПУБЛИКАТА: ID број? Дејвид Џ MALAN: Значи идентификациски број, можеби телефонски број, а можеби и студентски дом, или куќа, или колеџ, или нешто слично. Било кој број на делови на податоци кои може да имате во вашата листа на контакти е она што може да се дефинира како студент. Значи, ако сакаме да го направите ова, во кодот, ние би можеле да се направи нешто едноставно како ова. Ние би можеле да имаат програма, така што има да речеме, int главната (празно). И ако сакам да го застапува студент би можел да има, на пример, низа наречен име за кои ученикот, низа наречен студентски дом за тој студент, можеби на int нарекува проект за кој студентот. И затоа јас сум со користење низа, јас треба да се врати и да постават cs50.h. Можеби и јас ќе одам да се потребни stdio.h. Значи, дозволете ми превентивно се направи тие и јас сум требаше да се јавите на оваа student.c за сега и да го спаси ова. И сега можам да направам нешто со овие променливи. И ние сме само ќе да се напише што како коментар во псевдо код, затоа што тоа не е интересно она што го правиме сега за сега. Добро, така што ова е програма со која некако продавници студент. Што сакам да се направи, ако јас сакате да ги чувате двајца студенти? Така мојот прв инстинкт се случува да се биде во ред, почекајте една минута, ако имам друг ученик Зошто не јас само го направи низа име 2, стринг dorm 2, int id2. И ние го направивме заминувам надолу овој пат пред и она што беше нашето решение за она што се чини да биде еден вид на hackish копија паста работа тука? ПУБЛИКАТА: Низа. Дејвид Џ MALAN: Да, ние би можеле да се користи низа. Право ова многу брзо станува тежок за употреба. Мора да се најде решение на произволно проектот именување сите овие променливи. А ти, со луѓе, мора да се задржи следи дека во ред name2 одговара со dorm2 кореспондира со id2. Тоа само станува хаос. Така, тоа е многу полесно, потсетиме од пред неколку недели, само да се има да се нарекува имиња низа а можеби и да ни даде три од нив. А потоа можеби и имаме стринг домови и имаат три од оние, или со постојан, int IDS и имаат три од нив. Но дури и сега тоа се чувствува малку невешт, нели. Зборуваме за студенти и уште Јас сум навистина живеат на ниско ниво имплементација детали. Студентот се името и студентски дом и проект. Зошто не можам само да декларирате променлива наречен студент и повик е тоа. И ако сакам друг ученик, зошто да не само го нарекуваат т. Или ако сакам целиот куп на студентите, зошто да не се направи јас само велат дека имам една цела класа студентите, и тоа е три од нив. Со други зборови, зошто не можам да се со мојот сопствен тип на податоци, наречен Ученици, во внатрешноста на кој е име, е проект, е дом, е било кој број на други области. И излегува вас може да го направи токму тоа. Па C има оваа функција наречена struct. Тоа е карактеристика јазик кој ни овозможува да го прават токму тоа. Одам да се оди напред и ќе отвори structs.h каде што ние ќе треба да се види по дефиниција на студент. Излегува - и ова е уште една поедноставна од една од кои еден проект пред еден миг. Ако сакате да се излезе со вашата домашна тип на податоци, а во прилог на int, и знак и плови и сите овие другите кои постојат, можете да го направите со буквално пишување typedef struct, тогаш некои големи загради, во внатрешноста на кој ќе се листата на променливи што сакате да го се дружат со овој нов сопствени податоци тип како име и студентски дом, а потоа и по големите загради ви даде името на новиот тип на податок. Така, на пример, студент. И она што е убаво за ова сега е дека ако се осврнеме на соодветниот код, Конвенцијата, првиот на сите, е да се стави ова во датотека наречена нешто точка ж, датотека со глава, кои не сме почна да го користи себеси премногу. Но, ние се случува да започне користење на сосема малку сега. И она што може да се направи со ова, во крајна линија, во тие неколку линии на код се прогласат токму тоа тип на податоци, еден студент. И сега ајде да го користат. Одам да сега одиме во датотека наречена structs1.c. И ајде да ги разгледаме во некој Неколку карактеристики тука. Па работи тука е најмногу познат, и ние ќе го се врати на она што не е запознаени со само еден миг. Секако, ова е и моите хедер датотека, кој е нов, како и, освен за pset 3, каде што, Потсетиме, имаме helpers.h. Па може да се сети # Include helpers.h. Зошто иако сум користите наводници наместо аглести загради? Кога треба да се избере помеѓу нив? Речиси секогаш јас се чини дека да се користи аголни загради. И тогаш, одеднаш, на линија шест јас сум со користење двојни наводници. Зошто тоа би можело да биде? Да? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Тоа е реален, што? ПУБЛИКАТА: Тоа е во вашата ИРО. Дејвид Џ MALAN: Да, тоа е во мојот вистински ИРО. И да не се задржиме на ИРО, бидејќи тоа е само алатка која јас користам. Тоа е во мојот тековната директориум, конкретно. Па structs.h е моето досие не се инсталирани во ИРО, во самиот оперативен систем, а тоа е во мојот тековниот директориум. Па конвенцијата е ако сакате за да го вклучите вашиот сопствен хедер датотека, можете само да користат двојни наводници. Она што ние го нарекуваме оваа работа во алинеја 8, општо земено? Тоа е она што? #define нешто. Ова претставува константи, нели? Ако сакате да имаат вредност во вашата програма што ќе се користи во целина куп пати, тоа е добра конвенција да го земеш надвор, го покаже, со симболот на хаш се дефинира, а потоа, по конвенција, во сите големи букви word-- иако тоа не е строго неопходно, но тоа е човечкиот конгрес за да профитираат константи така што тие скокаат во вас visually-- простор и тогаш вредноста што сакате да биде еквивалент на името што е константа. Не запирка, но вие едноставно го следи тој модел таму. Значи она што го правам во овој вистински код. Па ајде да ги разгледаме во во главната програма тука. Во алинејата 12, бидејќи јас се вклучени structs.h, Јас сега имаат магично во мојата стои нов тип на податок. Јас не само да имаат пристап до int, и знак, и плови, и стринг, и сина и други. Јас сега имаат пристап до тип студент податоци. Па во линија 12, јас сум комбинирање на две ideas-- еден вид сопствени податоци и два, користење низа. И така во оваа програма ако Сакам да всушност поддршка три различни студенти во мојата програма, јас можеме да кажеме едноставно ми даде една променлива наречен ученици, од кои секоја е од учениците тип, што е мојот тип сопствени податоци. И, посебно, да ми даде три од оние во мојот низа. Па сега што ќе правиме во оваа програма? Еве само за телефонска линија процесирањето од 0 до 3, затоа што тоа е она што е вредноста на студенти. Јас сум само прашува корисникот дај ми име на студентот. А потоа и во линија 17, ние имаат најмногу зна- линија. Имаме нашиот стар пријател Getstring на десната страна. И она парче синтакса очигледно е ново, ако никогаш не сум програмиран во C и досега, и никогаш не користеле structs? Да? Публика: .name. Дејвид Џ MALAN: На .name. Но тоа не е премногу на скок, бидејќи сега студенти заградата јас ви дава i-тиот студент. И ако сакате да се нурне во внатрешноста на таа структура, можете само да се користи еден период и потоа името на променливата во внатрешноста, или имотот во внатрешноста, кои сакате да се добие пристап до. Слично на тоа, тогаш, ако јас тогаш го извести корисник, дај ми студентски дом на студентот, Слично на тоа што можете да ги чувате дека стринг променлива во внатрешноста на домот на оној студент структура. И сега работите се малку фенси. И тоа се случува да се погледне можеби во многу скоро време. Но ќе видите оваа далеку повеќе во pset 4, па да само се загледувам во тоа сега. Излегува дека во согласност со 23 38, што мислиш, јас сум можеби правиш? Сум отстрани коментарите за денес, но на верзијата од кодот онлајн референца има сите коментари. Што ми се чини дека да се прави? ПУБЛИКАТА: Зачувување на датотека со сите информации што корисникот внесе. Дејвид Џ MALAN: Да, точно, ова е нов начин што сме сведоци две, Друга карактеристика на C, со која можам да се создаде мојата датотеки. Досега, речиси секоја програма што сум напишал е без државјанство. Штом тоа е направено по ред, тоа е тоа. Нема меморија или сеќавање на него. Не постои датотеката зачувана. Но, ако вие не сакате да спаси внесување дека има се случи, како што се во игра или програма вака, излегува можеме да го стори тоа. И ќе видите дека ова повеќе во pset 4 и точка. Но оваа линија 23 во суштина креира датотека наречена students.csv. А вие може да се види тоа порано. Дури и ако никогаш не сум студирал CS пред, CSV е разделени со запирки променливи. Тоа е како многу лош верзија на една датотека Excel, што значи дека може да се отвори во Excel и во Apple броеви, и има редови и колони. Но тоа не е комерцијален формат како Microsoft или Apple. Тоа е само запирки одвојување на вредности кои ние ќе се види во еден момент. И само се погоди. Во линија 23, на самиот крај, мојот втор аргумент на оваа нова функција наречена ѓ отворен за отворена датотека е w. Она што може да се означи w? Да? ПУБЛИКАТА: Тоа ви овозможува да се запише во датотеката? Дејвид Џ MALAN: Таа им овозможува на можете да запишам во датотеката. Па има неколку варијанти дека ние може да се вклучи во тука. Но, ако само сакате да го прочитате на датотеката, тоа е се погледне во него и да го прочита во меморијата, што го само користење цитат unquote "р". Ако сакате да се напише на датотека, можете да користите цитат unquote "W". Има исто така, го додаваат и неколку други работи ако сакате да го менувате постоечките датотеки. Сега ние ќе треба да ги гледате ова нешто, тогаш ние ќе се вратам на линијата 24. NULL, што се испоставува, е посебна вредност што може да се врати од страна на одредени функции ако нешто не е во wrong-- Ако датотеката не постои, ако сте снема меморија, или еден куп други грешки. Но, за сега, ајде само да се претпостави дека ова е само конвенционален грешка проверка. Тука во линија 26, Јас сум во процесирањето 0-3 над сите мои студенти. И ова е вид на вид на новата функција, fprintf, туку само се погоди. Ако printf е само за печатење форматиран стринг, што значи fprintf веројатно значи? ПУБЛИКАТА: Печати во датотека. Дејвид Џ MALAN: Испечатете форматиран стринг во датотека. Тоа е она што на дополнителни ѓ значи е датотека. И новиот Првиот аргумент мора да биде променливата што го претставува вашиот фајл. Тогаш можеме само да има формат стринг како printf. И иако ова Синтаксата е ново, тоа само значи да се вклучи во името на студентот, plug-in-на студентски дом, а потоа со запишам, во близина на датотеката. А потоа lastly-- ова е ново и ние ќе се вратам на оваа пред long-- јас сум ослободување ученикот од причини што се случи таму горе. Но, ние ќе се вратам да дека пред long-- тоа е затоа што на тоа како GetString е всушност работат под хауба. Значи, да се земе брз поглед тука. Ако сум тип ls во мојот именик, забележите дека јас не имаат фајл наречен students.csv, едноставно не постои, не постои. Значи, ако јас сега собере на оваа програма, направи structs-1. / structs-1, а јас ќе одам да се оди напред и да внесете Анди, кој живее во Беркли на Јеил. Ние ќе треба да се има на Роб кој живее во Тајер овие денови. И ајде да се излезе со која е, мислам, Марија е во Mather, ако јас ги помнам правилно. Па ништо не чини да се случи. Но, ако сум тип ls сега, постои students.csv. Ајде да одиме напред и отворени students.csv. Ова е повторно една многу лесен формат на датотека. Но, јас сум едноставно усвои конвенција дека имам две редови и колони тука. Првата колона Првиот имињата на луѓето. Втората колона е на студентот студентски дом, или колеџ, или куќа, или какво ли не. И сега јас сум спасен ова трајно во датотека. Па тоа не е сè што интересно. Но ова е само отскочна штица сега да се биде во можност да се истрае информации трајно. Да видиме сега што повеќе можеме да се прави со овие и други карактеристики. Но, прво, било какви прашања? Тоа беше многу, и тоа беше брзо. Но, ќе видиме многу повеќе во pset 4, како и. Да? ПУБЛИКАТА: Дали постои начин да се продолжи додавајќи имиња на таа датотека? Дејвид Џ MALAN: Добро прашање. Дали постои начин да се продолжи додавање имиња во таа датотека? Да. И дека, всушност, ако заврши до повторно отворање на датотеката, ќе се користи цитат unquote "а" за додавај, кој само ќе додадете нова линија, нова линија повторно и повторно, точно. Добро прашање. Други прашања? Да? ПУБЛИКАТА: Ако го истрча програмата повторно, токму сега, би ја задржите додавањето на имињата на поднесе или тоа ќе се отвори нова датотека? Дејвид Џ MALAN: Ах, добро прашање. Ако повторно право да истрча на програмата сега, можеби чука со нови имиња, ќе ја додадете во датотеката или да запише врз датотеката? Второто, затоа што јас сум не користи append режим. И бидејќи јас сум само слепо отворањето на датотека за запишување, тоа е само ќе да запише врз датотеката. Па јас навистина ќе треба да направите е да додадете, ако сакам да се, всушност, имаат долгорочен база на податоци. Сега CSV е корисно, искрено, дури и за како ако сте writing-- и ние на крајот ќе го видите овој подоцна во текот на семестарот, кога ние ги користиме CSVs за други цели. Ако сакате да ја запази сите луѓе кои се регистрирани за некој настан, или да се регистрираа за вашиот студент група, или нешто слично, складирање на податоците во овој вид на формат е супер лесен. Бидејќи буквално, ако можам требаше да го симнете овој фајл. Можев и double-- ајде да се, всушност, се обиде овој ако имам Excel или броеви за тука. Одам да кликнете со десното копче или контрола-клик моето досие. Whoops. Кликнете со десното копче или контрола-клик моето досие. Ајде, мојот глушец не соработува. Download-- Одам да преземете сите датотеки тука, па само за да можам да го зграби оваа. И ајде да видиме дали тоа функционира students.csv-- прв пат Сум се активира. Сега тие сакаат да се види моите контакти. Сега, јас треба да се регистрирате. Видите колку е лесно е да се користи CSVs? Да, тоа се задржи до датумот. Добро, сега ние сме подготвени за класа. Добро, ох, што има ново? ОК, блиску. Кој беше магично. Во ред, сега ние треба да се ажурира. И сега, тоа заборавив што поднесе Јас првично се отвори, но она што a-- таму ќе одиме. Добро, па сега имаме една датотека Excel. Ти благодарам. Добро, па она што го направив беше лесно дел. Се разбира дека би можеле да имаат пред-инсталиран Excel, или броеви, или што и програма. Но, ова е убаво, бидејќи Јас сега може да се манипулира податоците во стандарден формат. Контекст Па сега ајде префрлат на каде што застанавте Последниот пат, кој требаше да започне да ги тргнеме обука тркала. Но, прво, не види ова порано ручек повторно се случува тука во пожар и Мразот во Кембриџ, sitar во Њу Хејвен. Регистрирај се на Facebook за веб CS50s ПОБРЗО да се приклучат на студентите и вработените CS50. Значи ние се обука тркала во понеделник како follows-- стринг е прогласена во CS50s библиотека за некое време. И тоа е убаво, бидејќи им овозможува на ни да се зборува за варијабли, како да бидат заврши зборови и реченици и многу повеќе. Но, се покажа стринг не постои. Тоа е само синоним, или псевдоним, кои ние направивме за нешто што всушност е малку повеќе технички нарекува знак *. И навистина, видовме еден пример на програма во понеделникот кои не се однесуваат сосема како што се очекуваше. Ова беше фајлови, да ги споредиме-0. И се сети дека се споредуваат-0, ако Јас го прекомпајлирате програма во понеделникот и да ја стартувате споредуваат-0 и тип во мајка во мали букви, и мајка со мали букви повторно. Програмата инсистирав напишете различни нешта, и покрај тоа што мајка ти, и сето тоа во мали букви, е идентичен визуелно. Значи она што е на краток одговор зошто компјутерот мисли овие две жици се различни? Да? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Токму така. Значи, мајка, за прв пат Јас ја напишете во, е да се биде чуваат некаде во мојот компјутер меморија, но на друга локација од вториот пат кога ќе напишете во мајка. Сега тоа сигурно не може да се оптимизира. На компјутерот може да биде паметен и реализација на овие две жици, еј, тие се идентични. Дозволете ми да не redundantly ја продавницата. Но, компјутери не го сторат тоа оптимизација, освен ако не им каже да. Значи, по правило, тие се само ќе се заокружи во две различни места во меморијата. И така да биде појасно, кога ние во споредба на две жици, првиот беше наречен с, вториот беше наречен т, она што посебно беше јас споредување тука на линија 13? Је. ПУБЛИКАТА: Тоа е местото во меморијата дека променливата ќе точка. Дејвид Џ MALAN: Точно, јас бев споредување на место во меморијата дека овие променливи посочи. Значи конкретно, ако мајка беше на бајт број 1, и 2, и 3, и 4-- бидејќи се сеќавам на обратна коса црта 0 треба да биде на целиот пат на крајот. А другата инстанца на мајка ти, м-о-м, беше на адреса 10, 11, 12 и 13. Бев споредување 1, таа адреса, таа локација во меморијата, против, 10, кој е очигледно не е исто. 1 не е 10. Значи ова е убаво во таа тоа е прилично јасна. Но, тоа е проблематично доколку ние не може да изгледа да се споредат жици. Па fundamentally-- и во ова ниско ниво, ако си сакал да се имплементира програма за споредба две одделни зборови дека корисникот има пишани во квалитет, дали тие се редат знак за знак, само со општи термини, што ни е потребно да се направи, очигледно? Тоа не е доволно само да се погледнете во овие две адреси. Што треба да се направи? Да? ПУБЛИКАТА: iterate преку стрингот [Беззвучен]. Дејвид Џ MALAN: Да, ајде iterate преку низа. Ајде да го користите за телефонска линија, додека јамка, или она што сте најмногу задоволни. И ако имаме две жици некаде во меморијата, ајде да погледнеме во секоја екипа Првиот карактер, тогаш секој е втор карактер, тогаш третиот и четвртиот, и петта, додека не се погоди она што посебно стража вредност? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Да, обратна коса црта нула, на која точка во која било низа може да се заклучи дека тоа е. Дали сме исти секој карактер? Ако не, return false. Ако е така, врати вистина. И така тоа е токму она што оваа верзија на програмата се споредат-1.в прави. Тој е идентичен со она што ние погледна во понеделник, освен дека сум добиле ослободи од зборот string-- иако дека нема функционална impact-- сите Што го правам сега е отстранување некои визуелни тркала обука, но да се види јасно дека s и t се адреси. И тоа е она што на ѕвезда, ѕвездичка, претставува е адреса, инаку познат повеќе технички како покажувач. Па кога ќе се прогласи и за алинеја 9 и велат char * с, тоа не значи дека ми даде низа. Тоа значи дека ќе ме променлива чија цел во животот е да ги чувате на адреса. Затоа што јас сум за да се стави на адреса на стринг во него. И навистина, GetString, да биде јасно, не се враќа стринг. Тоа не го врати мајка обратна коса црта нула, сам по себе. Што значи getstring конкретно и прецизно да се вратат? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: адреса, адресата на првиот карактер во некои стринг има добивано. Па сега сме сведоци посебна клучен збор. А, јас се алудира на тоа порано. Ова се случува да се биде добар конгрес дека ќе видиме повторно и повторно сега. Јас сум проверка за да бидете сигурни дека s не е ништовен и t не е нула. Бидејќи врз основа на моето навистина брз споменување порано, она што би можело да значи ако GetString не се враќа адреса но N-U-L-L, што е повторно, некои посебни вредност? ПУБЛИКАТА: Грешка. Дејвид Џ MALAN: Тоа е грешка. Нешто тргна наопаку. И она што обично може да се случи, особено strings-- со која може да биде со непозната должина во advance-- можеби на компјутерите " надвор од меморија, можеби сте ја внеле во таков долго збор или реченица или поставите таква огромна есеј таму не е само доволно меморија. И така GetString не можат да се вратат на адреса на целата работа, па тоа само се враќа ништо. И што вели една грешка се случила со враќање на специјални NULL вредности. Тоа е адреса нула, така да се каже. Сега излегува C доаѓа со функција која го прави тоа повторување. Ние не треба да се спроведе оваа со за телефонска линија или додека јамка за нас самите. Ние може да се користи некоја функција, наречен посочно, промешува комп, или стринг споредуваат, чие цел во животот е да го прават токму тоа. Ќе го даде два покажувачи, две адреси, и тоа ќе оди на тие адреси а потоа спореди писмо за писмо за писмо за квалитет, запирање само кога она што е вистина? Кога треба да се промешува интуитивно комп престанат процесирањето, само за да биде јасно? Кога ќе се појави обратна коса црта 0 во двата стринг, на која точка може да одлучи има се што се исти, или немало разлика? Значи, ако ние ја извршите оваа сега и да се обиде нашата мала капитализација игра, така осигурајте се споредат-1, ./compare-1, и напишете мајка со мали букви двата пати. Сега тоа е иста работа. И ако јас го направи тоа повторно со мали букви, а потоа можеби и големи букви. Сега е навистина прави разлика помеѓу големи и мали букви. Затоа, не сето тоа тешко или магични, но тоа го прави сега објасни она што се случува под хауба. Па што повеќе можеме да се извлече од овој вид на час? Па ајде да ги разгледаме во тоа. Одам да се оди напред и да се напише брзо програма тука наречен копи-0. И сега ајде да одиме напред и, всушност, ајде да направиме this-- со копи-0, да ги разгледаме во она што имам тука. Јас прв пат му кажете на корисникот, да каже нешто. Сетне се низа и јас тоа се чуваат во ОК. Јас тогаш проверете дали е еднаква на еднаква NULL, само се вратат 1. Значи ова е само стандардна грешка проверка. Ништо интересно не се случило. И всушност, ако можеме да се ослободи од грешка проверка, ова изгледа како недела 1 кодот во моментот. Но почнав да се добие малку подобро за тоа. Сега во линија 16, пред една недела, можеби па дури и неколку дена пред или минути, може да се каже на линија 16 е создавањето променлива наречена т и копирање е во неа. И тоа е совршено разумни готова брза. Но, поточно сега. Што се случува во линија 16? Што е добивање копирани од десно кон лево? Да? ПУБЛИКАТА: е т добивање на адреса на е? Дејвид Џ MALAN: Токму така, т е добивање на адресата на е. Значи да биде јасно сега, кога ќе отидам назад кон тоа порано пример и јас го извлече нешто што сум го внеле во. И она што го напишавте in-- тука е ОК, и тука е она што сум го внеле во некаде во меморија, мајка, а потоа обратна коса црта 0 кој додаде за мене. Она што јас се чуваат во тука, да се потсетиме, ова е на локација, 1, 2, 3, 4, тоа е она што е ново е. Значи, ако на линија 16, велам дај ми друга променлива наречен т и продавница во на вредноста на s, што добива чуваат овде нема мајка туку само на бројот 1. Значи, ако ние се погледне напред во оваа програма Сега, она што ќе се случи? Значи забележите дека има оваа функција можеби ќе го користеле овој пред некое време за Цезар, или Vigenere, или можеби не на сите. Тврдам со мојот printf, јас сум ќе профитираат копијата т. Прва во редот 19, брз разумност чек, strlen проверки на должината на т. Затоа што не сакаат да се обидуваат да профитираат нешто ако нема стринг таму. Ако корисникот едноставно притиснете Ентер, нема ништо да профитираат. Па јас не сакам да го направи линија 21. Па линија 21 е Капитализиране која буква, очигледно, во Т? ПУБЛИКАТА: м? Дејвид Џ MALAN: Тоа изгледа како тоа е кој копирање? ПУБЛИКАТА: м. Дејвид Џ MALAN: Ух, м. Добро, така што првиот м, затоа што забележавте дека сум полагање да toupper, која ако никогаш не сум го видел тоа е само една функција да профитираат како свој придонес. т заградата нула значи даде мене нула карактер на т. И така како го прави ова промена на сликата, да биде јасно? Она што треба да се препишува и повторно да се промени во однос на s и t и мајка обратна коса црта нула. ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Да, па овој овде едноставно треба да добие променил to-- поправат this-- треба да се промени во капиталот м. Но, сега, погледнете подолу во програма, ако јас се печати s и t како што е чист, да се види што е ќе се случи печатење s и t. Така бидете копи-0, ./copy-0. Дозволете ми да оди напред и да напишеш во мајка во сите мали букви. Известување и на оригинални и копија се капитализирани. Зошто? Па, s и t се двете укажува на, ако сакате, исто парче на меморија. И искрено, ова е добивање навистина uninteresting-- фактот дека ние сме со користење адреса нула тука. Мислам, јас навистина не се грижат каде работи е во меморијата. Жал ми е јас сум бришење малку премногу. Но јас навистина не се грижат каде работите се во меморијата. И така, навистина она што програмери имаат тенденција да размислуваат за е дека кога се зборува за адреса, или покажувач, кој се грижи каде што е во меморијата. Не ми е гајле ако е така, бајт еден или една милијарда. Јас само се грижат дека овој променлива е ефективно укажувајќи на тоа парче на меморија. И така, сега па натаму, наместо каламбур преку произволни адреси меморија, ајде само да почне да се подготви покажувачи како покажувачи, како стрели. Значи она што S и T навистина се, според оваа програма, бидејќи за тоа како јас создаде т, тоа е само две одделни променливи укажувајќи на исто парче на меморија. И не ми е грижа каде и да се. Па ние може да се апстрактни далеку дека детали. Па како можам да го надминете овој? Ако сакам да се напише една верзија на копија програма со која всушност копии стрингот и капитализира само копија, само интуитивно, она што е мора да биде состојка за нашето решение? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Потребен ни е што? ПУБЛИКАТА: парче меморија. Дејвид Џ MALAN: Ние треба друго парче на меморија, нели? Ние не знаеме како да се да го направи тоа, сепак, е задолжително. Но јас вид на тоа да се случи, па дека оригиналниот мајка со мали букви завршува во тоа екстра парче на меморија. А потоа кога ќе се промени на копија, не сакаат да се промени оваа копија овде. Јас наместо сакате да го промените само овој примерок, така што оригиналниот е непроменета. Значи, ајде да видиме како да го направите тоа. На копи-1, која веќе има е лишена од коментар, но е коментираше онлајн. Ние наместо да го направите овие following-- линии се идентични, ме низа и повик е тоа. А сега да ги погледнеме во еден од нашите најважни комплекс, но на последниот на сложеност за некое време, линија 16 прави токму тоа. Значи, ако вашиот удобен со слика ние само drew-- ми даде нов парче меморија, копирајте се што е во него, ајде да видиме како можеме да го преведеме тој код. Па линија 16, на левата страна, char * т ми дава оваа рубрика овде. Тоа е се што го прави тоа. На десната страна, м alloc или Примерок, е распределбата на меморија, супер фенси, криптичната начин само велејќи: ми даде парче меморија. Колку меморија ни треба? Па, е вид на голема израз. Но, ајде да видиме што вели тука. Па ова, се разбира, е да даде ме на должината на стрингот е. Значи, мамо што треба да биде што? Па само три, нели? мајка е три карактери. Вие не се брои обратна коса црта нула кога ќе зборува за должината на стрингот е всушност, човековите видливи букви. Па мајка, па ова ми дава 3. Но чекајте, јас сум сега додавање на 1. Зошто ми е, всушност, сакаат да одвои 4 бајти, а не само 3? Да? ПУБЛИКАТА: За вредноста на стража? Дејвид Џ MALAN: Точно, за кои стража вредност. За обратна коса црта нула, Ми треба 4 бајти вкупно. Па ми треба должина на стрингот плус 1. А потоа само за добра measure-- и покрај тоа што на овој систем, тоа е секогаш се случува да биде 1-- сакам да кажам дека усоврши оваа страна на големината на знак. Излегува sizeof е оператор дека во C само ти го кажува број на бајти тоа е потребни за одреден тип на податок. Тоа не функционира за низи, обично, понекогаш го прави тоа. Но, во општ случај, бр. Но, тоа ќе ми кажете колку бајти на знак е, што излегува е секогаш 1. Значи ова е како множење со 1. Па супер криптичната потрага линија код. Но сето тоа се дава ми парче меморија. Но, дали тоа се чини дека се копира ништо во таа меморија? Не сеуште. И така тоа што го правам на линија 22, и 23, 24, 25, добро, јас едноставно да го направите тоа. И ова е вид на старата школа работи сега. Ова е како pset 2, каде што ти си само придвижување на работите наоколу во меморија, или подобро кажано со жици. Па јас сум процесирањето од 0 до должината на стрингот е. И јас сум со копирање на i-тиот карактер во ОК во i-тиот карактер во т. И затоа што, на програмерот, направени сигурни да одвои точно колку бајти како што треба, тоа е совршен еден-на-еден однос. И го копирам мајка во мали букви на нов. А потоа и на крај, да направам оваа линија. И па ефектот е само за да профитираат на оваа т тука. Толку многу да се апсорбира, но ако само се разгледа она што е навистина се случува на под хауба е само да се движат овие бајти околу сето тоа, Потребно е да се реши овој проблем е само за да ни го даде ова парче на меморија. Сега по ризик големо, дозволете ми да се покаже уште еден пример дека е речиси идентични, освен за тоа еден линија код. Значи ова е хакер верзија на оваа програма, ако сакате. Но ајде да го дестилираат тоа во она што се случува. Линија 24 се користи да биде на оваа т заградата јас добива на заградата i. Сега, јас сум ова да се менува многу повеќе криптичната ѕвезда т плус 1 еднакво ѕвезда ОК плус 1. Значи она што се случува и зошто имаме една ѕвезда карактер? Ние сме виделе ѕвездата пред, и тоа е се користат различно тука. Ние претходно видовме char *, сега гледам ѕвезда на почетокот, и тоа е во ред. Бидејќи излегува ние може да се заклучи само вид на од тие први принципи што се случува. Па само да биде јасно, она што е, а? Минатата недела, таа беше стринг. Дека не е доволно веќе. Она што е ОК, посебно? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: Тоа е покажувачот. Тоа е на адреса на Првиот карактер ги внеле во. Добро, што е т? ПУБЛИКАТА: [Беззвучен] Дејвид Џ MALAN: На адресата на првиот бајт во т, дека парче меморија пренасочени. Значи излегува дека кога ние iterate од 0 да се качуваат до низа length-- прв од сите, јас започнува на 0, бидејќи на оваа старата школа за јамка работа. Па само за едноставност, ајде се претпостави дека на првата линија на кодот е навистина само ова, нели. Ако ми е нула, додавајќи нула до нешто веројатно нема да имаат ефект. Па што е ова што зборуваш? Излегува дека ѕвездата Операторот во овој контекст е dereference оператор, кој е само фенси начин да се каже да одат на следната адреса. Па ако е е адресата на првиот лик во оваа парче меморија, * Кликнете средства одат таму. И затоа што ние сме подготвени сликата на овој начин, Можете да ги прифаќаат Следните ментална модел. Ако ова е ОК, и велиш * s, * s вид на како Улеи и скали, ако се сеќавате на играта од детството, е како да го следат тоа стрелката и да си одат на адреса. * T е иста работа. Така на проектот тука, отидете на својата парче. Јас не може само да се подготви за овој екран на тој начин. * T значи да се оди тука. А потоа, за телефонска линија е само велејќи дека овој лик се движат тука, се движи овој лик тука, се движи овој лик тука. Но, како да го направам тоа incrementation? Јас треба да го вратите она што јас само избришани. Ова е она што обично се нарекува покажувачот аритметика, која значи математика со адреси. Ако, во овој за телефонска линија, Продолжувам да ја зголемува I, и s е адреса, а t е адреса, ако јас само ја задржите додавањето на 1, тоа само значи да се движат напред, и напред, и напред во меморијата. Тоа е како Оксфорд Стрит, улица дека зградата CS е вклучен. Зградите CS е на 33 Оксфорд Стрит. Значи, ако сте во ситуација да се направи 33 Оксфорд Стрит плус 1, што ќе ги носи 34 Оксфорд Улицата, а потоа 35 Оксфорд Стрит, потоа 36 Оксфорд Стрит, што и оние згради, всушност се - доколку тие постојат. И така, тоа е се што го правиме тука со покажувач аритметика. Па тоа е супер мистериозен начин за изразување на себеси. Но сето тоа се случува под хаубата е само по овие адреси, како следнава мапа, ако сакате, или по стрели како ние сме подготвени на екранот. Добро, многу да се вари. На секое прашање на синтаксата, концепти, покажувачи, Примерок, или слично. Да, овде прво. ПУБЛИКАТА: Значи, каде што вели * T еднаква toupper * т, е тоа што ќе профитираат сите букви или just-- Дејвид Џ MALAN: Ах, навистина добро прашање. Значи во оваа линија, тука, 31, е ова се случува да профитираат првата буква или сите букви. Значи, да се одговори на тоа со одење назад кон првите принципи. И првите принципи тука мислам Едноставно кликнете на основни дефиниции на она што се вклучени. Па toupper е функција дека капитализира знак. Тоа е се. * T значи оди на first-- одат на адреса во т. Значи, на сликата, ако ова е парче меморија ние распределени со Примерок, и ова е т, * T значи одат овде. Во меѓувреме, ти си поминува таа вредност, мали букви m да toupper, ти си добивање назад М капитал, каде што ви го стави? Ти си тоа ставање во истата таа локација. И така со таа логика на оние основни дефиниции тоа е само Капитализиране на првата буква освен ако iterate со I или за телефонска линија или додека јамка, тоа не се случува да се направи нешто повеќе од ќе го прашам. Добро прашање. Да? ПУБЛИКАТА: Зошто го користите dereference начин, отколку низата? Дејвид Џ MALAN: Ах, добро прашање. Зошто и вие ќе ја користите dereference метод наместо метод низата? Без некоја посебна причина, да бидам искрен. И дека, всушност, за ова вид на пример, десно, Јас сум само се расправаат со што програма покомплицирано, повеќе очи глазура над, луѓе се одјавувањето затоа што ова изгледа супер таинствени, но и покрај тоа што таа го прави истото. И така, искрено, ова е непотребно визуелно комплекс решение за проблемот. Тоа е сепак добар дизајн, пет од пет за проектирање, без разлика дали е во држачот нотација или нотација на покажувачот. But-- особено кога ќе го добиеме Подоцна во текот на pset 5 кога ќе го имплементира овој речник што Што сум споменат неколку times-- ние, всушност, ќе се грижат за ниско ниво адреси меморија дека ние навистина се разбере што се случува. Но, за сега, излегува дека овој линија код овде квадратни загради навистина не постои. Тие се она што се нарекува синтаксички шеќер, кој е само чудно кул начин на велејќи дека компајлерот претвора квадратни загради да биде дека математички израз. Така, тоа е човечко конгрес за да може да се пишува овие многу user-friendly загради. Но, она што на компајлерот, ѕвекот, е навистина прави секое време ти пишувам она што се истакнати во линија 24, под хаубата, тоа е навистина конвертирање на ова. Тоа е само повеќе пријатни како човек да читаат и пишуваат код како линијата 24. Но на крајот тие обука тркала премногу падне кога сопствената удобност се засилува. Добро, па потоа да се потсетиме дека овој е вид на најголемиот проблем ние трчаше во. И тоа е она што предизвика целата оваа проклето разговор за покажувачи, и адреси, и копирање работи. Тоа е затоа што ние се сопна овој глупав, глупав прашање, при што Се спроведува logically-- со Лорен до тука на демо и сок од портокал во milk-- совршено алгоритамски точната функција Замена за две променливи " вредности, но проклето нешто не имате било какви упорни, или постојан, ефект на мојот код. И зошто тоа? Во мало, зошто е ова имплементација на swap логично е точно, но нема влијание на променливи кои се пренесуваат до него, како x и y за главната? Она што беше главното обележје на тоа прашање? Да? ПУБЛИКАТА: Поради променливата направени копии на променлива во пас преку функцијата. Дејвид Џ MALAN: Токму така, кога ќе помине променливи во функција, или аргументи во функција, тие се донесени од страна на примерок, кој значи можеш да изгледа идентично шема на битови за x и y, нарекува тука a и b. И можете да направите ништо што сакате со овие копии, но тие се случува да немаме ефект врз функцијата на повик. И дека, всушност, ние привлече дека сликата на екранот, да се потсетиме Последниот пат, при што ако навистина мислат за она што е случува под hood-- ако ова е меморијата на вашиот компјутер, и овде е парче меморија се користи за главната, ова е парче меморија се користи за трампа, па дури и ако има главна две променливи, x и y, своп би можеле да имаат идентични потрага вредности, од кои и двете се 1 и 2, но тие се целосно различни делови од меморијата. Па ние треба решение за ова. И искрено, се чини дека ние сега да има решение за овој проблем, во право. Ако ние сега имаат способност да манипулира работи по пат на адреси и, на некој начин Улеи и скали стил, следете стрели и оди никаде сакаме во меморијата, ние не можевме реши овој проблем со преминувајќи од главните да се разменуваат не вредностите сакаме да swap, но само интуитивно што би можело да се поминува, наместо да се разменуваат? [Interposing ГЛАСОВИ] Дејвид Џ MALAN: Зошто да не се само да го давате на адресите, нели? Зошто не можеме да се даде се разменуваат со богатство карта, ако сакате, дека тоа доведува до Вистинските вредности x и y. Ајде, swap, всушност ја менува оние оригинални делови, наместо само поминуваат копии на битови. И така, всушност, тоа е она што е нема да биде решение. Оваа верзија е тука јасно се лоши и недостатоци. И сега, на прв поглед, тоа само изгледа како што додаде еден куп ѕвезди случајно и нашите прсти ја преминал дека тоа ќе се состави. Но, тоа сега се собере. Но, да видиме што значи тоа. И, за жал, авторите на С можел да избере друг симбол да се направи ова малку појасно, но операторот на ѕвезда има различно значење во две различни контексти. И видовме и двете, но, ајде да се направи разлика. Па на врвот таму, кога ќе се менуваат a и b од тоа да биде цел број во лоша верзија за да се int ѕвезди, a и b, Претходно, беа цели броеви. Кои се a и b, сега во доброто, зелена верзија? Тие се адреси. Адресите на тоа што, за да биде јасно? Адресите на цели броеви. Значи фактот дека јас сум велејќи int ѕвезда средства ова е адресата на цел број, посебно. Па сега се забележи во линии на код, нешто се сменило премногу. tmp останува иста, бидејќи тоа е само привремена цел број, Нема магија меморија таму. Но сега треба ѕвезда. И дека, всушност, секој други споменување од a и b, забележите дека сето она што е менува од црвена во зелена е во тоа што јас сум на префиксот овие променливи со ѕвездите. Затоа што не сакате да ги копирате a и b. Затоа што ако јас само копија a и b и swap a и b, што зборувам јас всушност Замена? Само адреси, сакам да се разменуваат што е на тие адреси. Сакам да одам таму. И така операторот на ѕвезда внатрешноста на мојата функција, не и во внатрешноста на листата на параметарот, значи да одите на тие адреси а всушност се променат овие вредности. Значи она што не ја сликата сега изгледа, наместо. Па, ако наместо сум полагање во за А и Б не 1 и 2-- Јас всушност треба да се додаде една друга дефиниција тука. Па претпоставувам дека ова парче меморија е на 10 место. Ова е на 11 место, но ова е малку на поедноставување, Јас сега имаат два избора ми помине x и y или да го поминат нивните адреси? Ако јас го положат своите адреси вака, јас само сега треба да се имплементираат Трампа на зелените код така што кога ќе види и кога се б гледа, не е само копија на a и b и се движат на млеко и сок од портокал. Сок од млеко и портокал метафора сега се распаѓа, бидејќи тоа се чаши на течни и не мапи. Ние наместо да треба да одат да се справат со 10 и ние треба да се обратите за решавање на 11, и потоа да се извршат дека Замена логика. Па логиката е иста, но ние треба малку поинаков начин на пристап до овие променливи. И така, на крајот, она што Програмата има за да изгледа како што е оваа. Во swap.c буквално копирани и атипичен зелена верзија. Но, јас треба да се направи една промена. Тоа не е доволно само да се промени трампа. Кои други линија на кодот Дали треба да се промени? Да? ПУБЛИКАТА: Таму каде што е потребно аргументите. Дејвид Џ MALAN: Каде што е потребно аргумент. Значи, ако јас се движите нагоре кон главната, јас не може да помине во x и y, и, ветувам, последниот парче од нова синтакса денес. Јас треба да се помине во не x и y но на адреса на x и y. И што излезе, симболот дека авторите на С одбрав е ако користите симболот тука, да не се да се мешаат со bitwise симболот, ако користите симболот тука и симболот тука, ова фигури за вас, што е адреса на x, можеби тоа е 10, што е адреса на y, можеби тоа е 11, и поминува оние во, наместо. Толку многу да ги апсорбира сите одеднаш. Но, да видиме сега брзо во нашите преостанатите четири минути каде што работите може да тргне на лошо. И како настрана, всушност, Зедов оваа слика, ТФ Зедов оваа слика пред една година или две. Значи ова е задниот агол на Елиот Јадење сала. Покажувачи се можеби најтешкиот тема која ќе покрие во CS50. Значи, ако сте загрижени дека вид на патека е како што можеби е повеќе на хокеј стап како ова, се реализира ние сме вид на близу врвот во однос на концептуалните комплексност. И јас се донесе до оваа слика, бидејќи се колнам на Бога, во есента 1996 година, кога го зедов CS50 со мојот настава колеги, Nishat Мехта, ме седна во агол на Д. Дом Елиот над ручек, или вечера, или нешто да се обиде да ми помогне да се разбере покажувачи. И ова е местото каде што бев недели по тоа беше воведен во предавање кога Јас конечно сфати покажувачи. И јас сум се надеваме дека оваа ќе кликнете далеку порано за вас. Но сфати ова апсолутно меѓу пософистицираните теми ние сме погледна. Но, тоа е една од најмоќните. И кога ќе го добие, тоа е навистина сите само ќе се конечно дојде заедно. Така бидете сигурни дека не го прави тоа треба да се потоне во денес. Значи тука е последната програма ние ќе треба да се погледне. И ние ќе треба да заврши со брзо три минути од claymation направени од страна на нашиот пријател, Ник Parlante. Еве една програма, односно на првите две линии изјавува променлива x и y. Од кои и двете се адреси на цели броеви, АКА покажувачи. Ние тогаш се одвојат доволно меморија за складирање на int и чување на адресата од таа меморија во х. Значи, тоа е уште поедноставно отколку на пример порано. Дај ми четири бајти меморија, тоа е големината на int, и да се стави таа адреса во х. Оваа линија тука значи одат на адреса во х и го стави на значењето на живот, бројот 42 таму. Но оваа линија ме загрижува. Ѕвезда y значи одат на адреса во y, и го стави на несреќен број 13 таму. Зошто е опасно, во овој момент во story-- иако брзо изјави во нашата самрак минути here-- зошто тоа е лоша за мене да кажам, одете на адресата во y? ПУБЛИКАТА: не Имате [Беззвучен]. Дејвид Џ MALAN: Не сум стави нешто во y. Значи она што е вредноста на y, во овој момент во приказната? Немаме поим. Тоа е некоја вредност ѓубре и ниту Binky знам. Ако би можеле да се стави крај на оваа белешка. [Видео репродукција] -Hey, Binky, разбуди се. Тоа е време за покажувачот забава. -Што е тоа? Учат за покажувачи? Ох, стрина. -Па, За да започнете, претпоставувам дека ние сме ќе треба неколку совети. -ВО РЕД. Овој код одвојува два покажувачи која може да укаже на цели броеви. -OK, И ја гледам два покажувачи, но тие не се чини дека се укажува на ништо. -Тоа е точно. Првично покажувачи не укажуваат на ништо. Работите што укажуваат на се наречен pointees и поставување на нив е посебен чекор. -OH, Нели, нели. Знаев дека. На pointees се одвоени. Па, како да ги распредели pointee? -OK, И овој код Доделува нова цел број pointee, и овој дел сета x за да укажуваат на тоа. -Hey, Дека изгледа подобро. Така да тоа се направи нешто. -OK, Јас ќе dereference покажувачот x за да го чување на број 42 во својата pointee. За овој трик, ќе ми треба магично стапче на dereferencing. -Твојата Магично стапче на dereferencing? Ух, тоа, тоа е одлично. -Ова Е она што го кодот личи. Јас само ќе се постави на бројот and-- [Поп звук] -Hey, Погледнете таму оди. Така, прави dereference на X следува на стрелката за да пристапите до своите pointee. Во овој случај, за чување на 42 во таму. Еј, се обиде да го користи за чување на бројот 13 преку други покажувач, y. -ВО РЕД. Јас само ќе одиме во текот тука за да y, и да се добие бројот 13 поставеност. А потоа да се стапот dereferencing и just-- [BUZZER SOUND] -OH, Еј што не работат. Велат, Ш, Binky, јас не мислам dereferencing y е добра идеја, бидејќи поставување до pointee е посебен чекор. И јас не мислам дека ние некогаш го направив тоа. -Hmm, Добра поента. -Да, Ние распределени на покажувачот, y, но ние никогаш не го постави за да се укаже на една pointee. -Hmm, Многу капацитет. -Hey, Вие барате добро таму, Binky. Можете ли да го поправам, така што y поени на истиот pointee како x. -Sure, Јас го користам моето магично стапче на покажувачот задача. -Дали Таа ќе биде Проблемот, како и пред тоа? Не, ова не допира pointees. Тоа го менува еден покажувач да укажуваат на истата thing-- [Пукање SOUND] --as друг. -Ох гледам. Сега y укажува на истото место како и х. Значи, чекај, сега y е фиксна. Таа има pointee. Па можете да се обидете на стапче dereferencing повторно да се испрати во текот на 13-те. -OH, Во ред, тука оди. -Hey, Погледнете во тоа. Сега dereferencing работи на y. И затоа што се делат совети дека еден pointee, тие и двете се види на 13. -Да, Споделување, ух, сеедно. Значи, одиме да се префрлиш места сега? -OH, Изгледа ние сме надвор од времето. -But-- -Само Се сеќавате на три правила е покажувачот. Број 1, основната структура е дека ќе имаат покажувач, и тоа укажува на посебен pointee. Но го покажувачот и pointee се одвоени. И честа грешка е да се постави на покажувачот но да се заборави да го даде pointee. Број 2, покажувачот dereferencing почнува на покажувачот и го следи нејзиното стрелката над да пристапите до своите pointee. Како што сите знаеме, ова работи само ако има е pointee, кој вид на добива назад да се Правило број 1. Број 3, покажувачот задача трае еден покажувач и се менува за да се укаже на исто pointee како уште еден покажувач. Па по задача, два покажувачи ќе укажуваат на истата pointee, понекогаш тоа се вика споделување. И тоа е сè што постои на неа, навистина. Спане сега. [END репродукција] Дејвид Џ MALAN: Тоа е тоа за CS50. Благодарение на професорот Ник Parlante. Ќе се видиме следната недела. [ЕЛЕКТРОНСКИ музички]